您希望能够Const
像 Scala 可以添加不同的数字类型一样添加类的实例。但是 Scala 并没有直接添加不同的数值类型,它使用隐式转换首先使它们成为相同的类型。你也可以这样做。首先,您需要添加Numeric
到您的课程中,正如 Gábor 所说:
case class Const[@specialized(Long, Double) T: Numeric](value: T) {
import Numeric.Implicits._
def +(that: Const[T]) = Const(value + that.value)
}
然后,定义隐式转换:
implicit def constConvert[A, B: Numeric](a: Const[A])(implicit conv: A => B) =
Const[B](a.value)
这接受隐式转换,从而将内置隐式转换推广到您的类型。现在你可以写:
Const(5) + Const(6.0) // Const(11.0)
编译为:
constConvert(Const(5))(_.toDouble) + Const(6.0)
由于 Scala 为向上转换的数字类型提供了合理的隐式转换,并且 constConvert 方法接受这种隐式转换,这通常适用于内置数字类型,以及任何定义合理转换和 Numerics 的新类型。
然而!
您应该知道,在这里您不会真正获得专业化的全部好处,因为标准库Numeric
不是专门化的(在撰写本文时),所以仍然会有自动装箱。相反,您可能想要使用SpireNumeric
提供的专用版本。