你可以用類型類來做到這一點。創建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] = [email protected]
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)
順便說一句,你可能有興趣看看[結構類型](http://daily-scala.blogspot.ru/2010/02/introducing-structural-types.html)。不是說它會解決上面的問題,但可能會給你另一種存檔方式。 – 2013-04-24 15:01:00
Scala在C++中沒有「模板類」。它具有Java/JVM意義上的泛型類。特別是(並忽略專業化),它使用類型擦除爲泛型類創建一個'.class'。該單個JVM類提供泛型類的所有實例。 – 2013-04-24 15:01:09
...這是[泛化泛型*(.NET中的泛型)和非泛化(JVM)]之間的區別](https://en.wikipedia.org/w/index.php?title=Comparison_of_C_Sharp_and_Java&oldid = 503563938個#Type_erasure_versus_reified_generics)。 – 2013-04-24 15:05:21