4

考虑:

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坦率地说,我对这个发现感到非常失望,因为它实际上阻止了使用值类的类型级编程(其中一个短暂的值类实例是由一系列琐碎的内联方法创建的。

4

0 回答 0