以下的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缺乏對此的支持?
在此先感謝!
你可以省略分號;你也可以省略構造函數的空括號。 – ziggystar 2011-06-17 07:03:56