我想要一个封装整数和浮点数的类。
基本上我想做这样的事
Const(5) + Const(6) = Const(11) Const(5) + Const(6.0) = Const(11.0)
编译器错误的代码。
case class Const[@specialized(Long,Double) T](value:T){
def +(that:Const[T]) : Const[T] = {
Const(this.value + that.value)
}
}-错误
:11:错误:类型不匹配;找到:t必需: String Const(this.value + that.value)
(不知道为什么要解析到字符串+操作符)
发布于 2017-11-02 06:14:58
您希望能够以与Scala添加不同数值类型相同的方式添加Const类的实例。但是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方法接受这样的隐式转换,所以这通常适用于内置的数值类型,以及定义合理转换和数值的任何新类型。
不过!
您应该意识到,在这里您不会真正获得专门化的全部好处,因为标准库Numeric并不是专门化的(在撰写本文时),所以仍然会出现自动装箱。相反,您可能希望使用Numeric的专门版本,比如尖顶提供的版本。
发布于 2014-12-06 11:21:27
下面是一个工作版本(当两个实例被不同类型参数化时,为了兼容使用,类型参数是必需的):
case class Const[@specialized(Long, Double) T: scala.Numeric](value:T){
def +(that:Const[T]) : Const[T] = {
//Const(implicitly[Numeric[T]].mkNumericOps(this.value) + that.value)
import Numeric.Implicits._
Const(this.value + that.value)
}
}用法:Const[Double](2) + Const(3.3)
https://stackoverflow.com/questions/27330872
复制相似问题