私が持っているとします:
trait Normalizer[T]{
def apply(x:T):T
}
case class DoubleNormalizer() extends Normalizer[Double] {
def apply(x:Double):Double {
... impl ...
}
}
ボックス化/ボックス化解除は次のいずれかの場合に発生しますか? @specialized はそれを回避しますか?
val d1:Normalizer[Double]
val d2:DoubleNormalizer
d1(123.4) // boxes Double? (probably yes because d1.apply(T=Object)
d2(123.4) // boxes Double? maybe not because s2.apply(Double)
特殊化しない場合、d2.apply の呼び出しは Double または Object を受け取りますか?
実現可能:
前者は、コンパイラがコンパイル時に証明できるため、apply メソッドの型は double です。
後者は、DoubleNormalizer.apply(Double) が Normalizer.apply(Object) の実装であり、apply(Object) が JVM が提供する唯一の具象型シグネチャであるためです。