2013-04-24 65 views
0

我是新的scala泛型,我已經閱讀了多篇關於視圖,類型綁定/上下文綁定的文章。當我試圖實施我的課程時,我感到非常困惑。斯卡拉泛型 - T有方法限制

我的問題是,假設我有一個模板類MyClass [T] {}。我想這牛逼必須例如一些方法:

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

注:類將使用MyClass的沒有牛逼因此我不能使用:<或:>

我已閱讀關於具有隱式函數的Ordered和Ordering,但我仍然無法弄清楚如何實現它。

感謝幫手

+1

順便說一句,你可能有興趣看看[結構類型](http://daily-scala.blogspot.ru/2010/02/introducing-structural-types.html)。不是說它會解決上面的問題,但可能會給你另一種存檔方式。 – 2013-04-24 15:01:00

+2

Scala在C++中沒有「模板類」。它具有Java/JVM意義上的泛型類。特別是(並忽略專業化),它使用類型擦除爲泛型類創建一個'.class'。該單個JVM類提供泛型類的所有實例。 – 2013-04-24 15:01:09

+0

...這是[泛化泛型*(.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

回答

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") 
} 

現在,如果你添加綁定到你的類的類型參數方面,它只能被實例化,當給定類型的實例在範圍內時。

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)