Scala Generics - T有方法限制

时间:2013-04-24 14:58:11

标签: scala

我是scala泛型的新手,我已经阅读了多篇关于视图,类型绑定/上下文绑定的文章。当我试图实现我的课程时,我真的很困惑。

我的问题是,假设我有一个模板类 MyClass [T] {} 。我希望 T 必须有一些方法,例如:

def func1(t:T):T
def func2(t:T):Boolean
def func3(t:T):Unit

注意:使用 MyClass 的课程不是 T 因此我不能使用:<或:>

我已阅读有关具有隐式功能的Ordered和Ordering,但我仍然无法弄清楚如何实现它。

感谢帮助者

1 个答案:

答案 0 :(得分:1)

你可以用类型类来做到这一点。创建一个trait,其中包含您需要的方法以及应支持的每种类型创建一个隐式实例:

trait MyTypeClass[T] {
  def func1(t:T):T
  def func2(t:T):Boolean
  def func3(t:T):Unit
}

implicit object MyTypeClassInt extends MyTypeClass[Int] {
  def func1(t:Int) = t + 2
  def func2(t:Int) = t > 4
  def func3(t:Int) = println(s"t is: $t")
}

现在,如果在类中添加绑定到type参数的上下文,只有当给定类型的实例在范围内时,才能实例化它。

class MyClass[A : MyTypeClass](a: A)

scala> new MyClass(2)
res0: MyClass[Int] = MyClass@47825164

scala> new MyClass("")
<console>:11: error: could not find implicit value for evidence parameter of type MyTypeClass[String]
              new MyClass("")**

您可以通过调用implicitly[MyTypeClass[A]]来访问班级中的实例。或者,您可以执行以下操作之一:

1。)而不是使用上下文绑定为类添加隐式参数:

class MyClass[A](a: A)(implicit ev: MyTypeClass[A])

2.。)为你的类型类添加一个伴随方法的伴侣,它隐式检索实例并返回它:

object MyTypeClass {
  def apply[A](implicit ev: MyTypeClass[A]) = ev
}

并在你的班级中使用它:

MyTypeClass[A].func1(a)