我想实现一个包装类,它有不同的方法可用,具体取决于它包装的类型。
我有这样的想法:
case class Wrapper[A](val : A)
case class Wrapper[A : Numeric](val a : A) {
def add[A](a : A) = new Wrapper(this.a + a)
}
val a = new Wrapper(1.0)
val b = new Wrapper(2.0)
val c = a add b
val d = new Wrapper(new Object)
val e = a add d // Compile Error!
我已经发现,我可以使用 Type Class -Pattern来限制传递的参数,但是当this
的类型不受限制时,这显然会导致错误
这是否可以在scala类型系统中使用?任何类型安全模式,以实现类似的结果(中缀符号在这里很重要)将不胜感激。
答案 0 :(得分:0)
您可以将此类约束直接添加到方法add
:
case class Wrapper[A](value : A){
def add(other : A)(implicit ev : A <%< Numeric[A]) =
Wrapper(value.plus( other))
}
在add
不是A
的实例上调用Numeric
会发出编译错误。
(已更新感谢@AlexIv)
用法:
val a = Wrapper(1.0)
val b = Wrapper(2.0)
val c = a add b