Почему не используются встроенные фабричные методы для классов значений?

Рассматривать:

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

При изменении конструктора детской площадки на:

val w = new Wrap(1)

оба показывают назначение буквального 1 в w как и ожидалось. Откровенно говоря, я весьма разочарован этим открытием, так как оно практически предотвращает программирование на уровне типов с использованием классов значений (где экземпляр класса эфемерных значений создается цепочкой тривиальных встроенных методов).

0 ответов

Другие вопросы по тегам