2011-06-17 99 views
2

以下的Scala類的根:斯卡拉 - 協變類型層次

class Foo[+T <: Bar] extends FooBase ... 

有效地限定,其具有的Foo [巴]一種類型的層次結構作爲其根 - 即,任何有效的Foo [X]將可分配給一個Foo [酒吧]值或變量:

val v1: Foo[Bar] = new Foo[SubBar1](); 
val v2: Foo[Bar] = new Foo[SubBar2](); 

FooBase進一步啓動並也可能意味着不富的對象 - 下面說明了問題:

class Trouble extends FooBase ... 
val iOnlyWantFooHere: FooBase = new Trouble(); 

...也FooBase不知道T類型的,因此其成員不能確定這一點,我不得不在富來覆蓋這些定義專攻他們:

class FooBase { 
    def ohNoIDontKnowTheType: Bar; 
} 

class Foo[+T <: Bar] extends FooBase { 
    override def ohNoIDontKnowTheType: T = ...; 
} 

還有其他的方法來解決這個問題,但重點應該清楚。

最後,我的實際問題是什麼是以下層次的根:

class Foo[+T <: Foo[T]] extends FooBase ... 

再次,不要告訴我FooBase,因爲那是不是這樣的。是的,我可以在兩者之間插入另一個班級,專門用於這個目的,但這仍不是如上所述的真實答案。

Scala的不喜歡只是Foo(無類型參數),並且它不是Foo[_]無論是作爲然後訪問方法返回類型參數類型的值實際上是Any,不Foo。當然,我們不能做Foo[Foo],因爲它也缺少第二個的類型參數,而Foo[Foo[_]]Foo[Foo[Foo[Foo[_]]]只能得到我們這麼多的級別。

有沒有答案或Scala缺乏對此的支持?

在此先感謝!

+1

你可以省略分號;你也可以省略構造函數的空括號。 – ziggystar 2011-06-17 07:03:56

回答

5

Foo[_ <: Foo[_]]怎麼樣?順便說一下,我在回答您的其他問題時也提到過。或者你可以這樣寫:

type Base = Foo[t] forSome { type t <: Foo[t] } 
+0

那麼,我錯過了那裏。我道歉。這是我期待的一個很好的答案。謝謝! – Learner 2011-06-17 12:50:21