考虑:
class Wrap(val amount :Int) extends AnyVal
object Wrap {
@inline final def apply(int :Int) = new Wrap(int)
}
object Playground {
val w = Wrap(1)
}
用(2.11.7)编译scalac -feature -Xprint:all Playground.scala
我看到了
Playground.this.w = Wrap.apply(1);
事实上,javap -v -private Playground
显示:
89: invokevirtual #75 // Method Wrap$.apply:(I)I
92: putfield #33 // Field w:I
将 Playground 构造函数更改为:
val w = new Wrap(1)
两者都按预期显示文字1
的分配。w
坦率地说,我对这个发现感到非常失望,因为它实际上阻止了使用值类的类型级编程(其中一个短暂的值类实例是由一系列琐碎的内联方法创建的。