我正在scala中试验上下文边界,但我没有找到一种方法来对这两个函数中的任何一个进行类型检查:
abstract class Expr
case class Val[T: Numeric](v: T) extends Expr
case object Other extends Expr
val e1 = Val(1)
val e2 = Val(2)
def addExp1(e1: Expr, e2: Expr): Expr = (e1, e2) match {
case (Val(v1), Val(v2)) => Val(v1+v2)
case _ => Other
}
def addExp2[T: Numeric](e1: Expr, e2: Expr): Expr = (e1, e2) match {
case (Val(v1: T), Val(v2: T)) => Val(v1+v2)
case _ => Other
}
在 addExp1 的情况下,我可以理解编译器在函数定义点没有信息知道 Val 的参数是 Numeric,因此有一个 + 方法。它只是匹配 Any 作为 v1 的类型。
在 addExp2 的情况下,如何强制在模式中绑定?类型被“擦除”...T 注释被擦除消除...
我梦想拥有的是一个单点来设置界限,理想情况下是 Val 类的定义。