假设我有:
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 将提供的唯一具体类型签名。