1

假设我有:

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

4

0 回答 0