为什么scalac盒子Int?

时间:2018-05-14 15:01:13

标签: scala int

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

rubocop —auto-correct filename.rb

并且发现它编译成了这段代码:

import scala.collection.immutable.HashSet

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

如您所见,在创建包含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,而非Int extends AnyVal

1 个答案:

答案 0 :(得分:6)

确切地说,Int extends AnyVal,而不是AnyRef。但是不可变的HashSet[A]A作为参数,它不是specialized for primitive types,也就是说,它不是@specialized(Int) A或类似的东西,所以它只能处理引用类型扩展AnyRef,原始类型必须加框。幸运的是,Scala编译器隐藏了这一点。