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