您看到的错误消息是因为Numeric[T].plus
只能用于将两个值相加同类型 T
。
您的代码是在数字加宽自动发生的假设下编写的 - 在这种情况下不会发生,因为编译器不知道有关类型的任何信息,除了存在一个Numeric[T]
实例。
如果你需要sum
要成为稳定的值,您必须在构造函数中提供必要的类型信息,如下所示:
class Arithmetic[A : Numeric, R <% A, S <% A](val a: Connector[R], b: Connector[S]) {
val sum = new Connector[A]((a.value:A) + (b.value:A))
}
这需要类型R
and S
可以转换成某种类型A
对于其中一个Numeric[A]
距离已知。
创建实例时,您始终必须提供所有类型参数,因为无法推断它们。
如果你不需要sum
为了稳定,你可以将你的课程更改为:
class Arithmetic[A,B](val a: Connector[A], val b: Connector[B]) {
// if A and B are the same types
def sum(implicit e: B =:= A, n: Numeric[A]): Connector[A] =
new Connector(n.plus(a.value, b.value))
// else widen to C
def wideSum[C](implicit f: A => C, g: B => C, n: Numeric[C]) =
new Connector(n.plus(a.value, b.value))
}
val a = new Connector(1)
val b = new Connector(2)
val c = new Connector(3.0)
val d = (new Arithmetic(a,b)).sum
// val e = (new Arithmetic(b,c)).sum // <-- does not compile
val e = (new Arithmetic(b,c)).wideSum[Double]
当扩大时,您仍然需要提供类型信息。