假设我有:
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方法的类型是双重的。
后者因为DoubleNormalizer.apply(Double)是Normalizer.apply(Object)的实现,而apply(Object)是JVM将提供的唯一具体类型签名。