我想參數化一些非常一般的類型參數的方法。斯卡拉類型:最小上界
作爲一個例子,在REPL我首先定義:
trait Term
case class FunctionalTerm[+T <: Term](t: T) extends Term
直觀地說,下面的方法以一個期限和一個FunctionalTerm,並返回一些與類型的最小上界通過術語的類型和FunctionalTerm的參數類型:
def ex1[T1 <: Term, T3 <: X, FunctionalTerm[T1] <: X, X <: R, R <: Term](t1: FunctionalTerm[T1], s: T3): R = sys.error("TODO")
到目前爲止,在REPL中這麼好。
然後我定義ex2
作爲進行相同的操作,ex1
一個方便的功能,但與輸入參數交換:
def ex2[T2 <: Term, T3 <: X, FunctionalTerm[T2] <: X, X <: R, R <: Term](s: T3, t2: FunctionalTerm[T2]): R = ex1(t2,s)
試圖在REPL定義ex2
提供了以下錯誤:
error: inferred type arguments [T2,T3,FunctionalTerm,T3,T3] do not conform to method ex1's type parameter bounds [T1 <: Term,T3 <: X,FunctionalTerm[T1] <: X,X <: R,R <: Term]
ex1(t2,s)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
ex1(t2,s)
^
error: type mismatch;
found : T3(in method ex2)
required: T3(in method ex1)
ex1(t2,s)
^
error: type mismatch;
found : R(in method ex1)
required: R(in method ex2)
ex1(t2,s)
^
我花了大約兩天的時間試圖找出解決方案,現在我完全陷入困境。我無法在Google上找到更多內容。
由於ex2
類型參數列表相同的ex1
但T1
和T2
交換,我不明白的是錯的,或如何解決它。
任何幫助將非常感激!
更新
最小上界是一個紅色的鯡魚。該示例可以進一步提煉。
以下兩個功能可以在REPL中定義而不會出現錯誤:
def ex1[T1 <: Term, FunctionalTerm[T1] <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex1")
def ex2[T2 <: Term, FunctionalTerm[T2] <: Term](t2: FunctionalTerm[T2]): Term = ex1(t2)
介紹額外的參數X
似乎會導致問題。我可以定義在REPL如下:
def ex3[T1 <: Term, FunctionalTerm[T1] <: X, X <: Term](t1: FunctionalTerm[T1]): Term = sys.error("TODO: ex3")
但嘗試之後定義:
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
給出了錯誤:
error: inferred type arguments [T2,FunctionalTerm,Nothing] do not conform to method ex3's type parameter bounds [T1 <: Term,FunctionalTerm[T1] <: X,X <: Term]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
error: type mismatch;
found : FunctionalTerm[T2]
required: FunctionalTerm[T1]
def ex4[T2 <: Term, FunctionalTerm[T2] <: X, X <: Term](t2: FunctionalTerm[T2]): Term = ex3(t2)
^
所以,我想這個問題就變成了:爲什麼簽名中未使用的參數X
是否具有此效果?
我忘了說,我使用Scala的2.10-M3。 –
雖然你沒有使用更高的類型:-) –
@oxbow_lakes哦......我會更正 –