在模板库中@specialized的好处,其中模板参数在调用时已知?

时间:2016-10-06 00:17:52

标签: scala generics boxing specialized-annotation

假设我有:

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

0 个答案:

没有答案