是否可以使方法仅在类/类型构造函数的特定实例中可用?

时间:2013-09-29 18:35:25

标签: scala generics types infix-notation

我想实现一个包装类,它有不同的方法可用,具体取决于它包装的类型。

我有这样的想法:

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类型系统中使用?任何类型安全模式,以实现类似的结果(中缀符号在这里很重要)将不胜感激。

1 个答案:

答案 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