2014-10-09 132 views
1

的方法時,讓我們來看看一些代碼第一類型不匹配:斯卡拉:調用從通用特質

trait Foo[T] { 
    def fooize(value : T) : Unit 
} 
object TestFoo { 
    def testFooForType[T[_] <: Foo[_]](obj : T[Int]) { 
    obj.fooize(5) 
    } 
} 

爲什麼它不進行類型檢查和如何克服這些困難?我想要做的是對特定類型T(示例中爲Int)實施給定特徵Foo的任何類別進行測試。

+0

我不需要'T'這樣在testFooForType'的'身體,你不妨使用'def testFooForType(obj:Foo [Int])'... – sjrd 2014-10-09 11:55:58

回答

2

T[_] <: Foo[_] 表示「T forSome type」擴展了「Foo forSome type」。

它必須允許類型不同的情況。 (T [A]擴展Foo [B])

使用Int類型綁定T對Foo的類型沒有影響,它仍然是無限的。

,您可以指定Foo的類型:

def testFooForType[T[_] <: Foo[Int]](obj : T[_]) { 
    obj.fooize(5) 
} 

,或者你可以讓類型的關係明確:

def testFooForType[T[V] <: Foo[V]](obj : T[Int]) { 
    obj.fooize(5) 
} 
+0

謝謝。我非常關注「T將只是一個擴展Foo特性的類」,我沒有想到這一點。 – matb 2014-10-09 20:39:39