【发布时间】:2013-02-01 15:40:35
【问题描述】:
我正在 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 类的定义处。
【问题讨论】:
-
您是只收到警告还是在
addExp2中收到错误?我必须做Val(implicitly[Numeric[T]].plus(v1, v2))而不是Val(v1+v2)才能让它编译没有错误。
标签: scala