您可以使用类型类来做到这一点。创建一个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")
}
现在,如果您在类中添加绑定到类型参数的上下文,则只能在给定类型的实例在范围内时实例化它。
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.) 为你的 typeclass 添加一个伴生对象,它有一个 apply 方法,隐式检索实例并返回它:
object MyTypeClass {
def apply[A](implicit ev: MyTypeClass[A]) = ev
}
并像这样在你的课堂上使用它:
MyTypeClass[A].func1(a)