gpt4 book ai didi

scala - 为什么 scalac 盒子是 Int?

转载 作者:行者123 更新时间:2023-12-05 00:12:41 26 4
gpt4 key购买 nike

我写了以下非常简单的测试:

import scala.collection.immutable.HashSet

class Test {
def m() = {
var s = new HashSet[Int]
s = s + 1
}
}

并发现它编译为以下代码:
public class Test {
public void m();
Code:
0: new #12 // class scala/collection/immutable/HashSet
3: dup
4: invokespecial #15 // Method scala/collection/immutable/HashSet."<init>":()V
7: astore_1
8: aload_1
9: iconst_1
10: invokestatic #21 // Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer;
13: invokevirtual #25 // Method scala/collection/immutable/HashSet.$plus:(Ljava/lang/Object;)Lscala/collection/immutable/HashSet;
16: astore_1
17: return

public Test();
Code:
0: aload_0
1: invokespecial #30 // Method java/lang/Object."<init>":()V
4: return
}

如您所见, 1在创建具有 1 个元素的新不可变集之前被装箱。为什么是盒装。 Int extends AnyVal ,不是 AnyRef .

最佳答案

没错,Int extends AnyVal ,不是 AnyRef .但是不变的 HashSet[A] A作为参数,它不是 specialized for primitive types ,即不是@specialized(Int) A或类似的东西,所以它只能处理扩展 AnyRef 的引用类型。 ,原始类型必须装箱。幸运的是,这被 Scala 编译器隐藏了。

关于scala - 为什么 scalac 盒子是 Int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50333479/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com