検討:
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
ています。率直に言って、この発見にはかなりがっかりしています。これは、値クラスを使用した型レベルのプログラミングを実質的に妨げているからです (一時的な値クラスのインスタンスは、単純なインライン メソッドのチェーンによって作成されます)。