次の Scala クラス:
class Foo[+T <: Bar] extends FooBase ...
Foo[Bar] をルートとする型階層を効果的に定義します。つまり、有効な Foo[X] はすべて Foo[Bar] 値または変数に割り当て可能になります。
val v1: Foo[Bar] = new Foo[SubBar1]();
val v2: Foo[Bar] = new Foo[SubBar2]();
FooBase はさらに上にあり、Foo ではないオブジェクトを暗示している可能性もあります。以下に問題を示します。
class Trouble extends FooBase ...
val iOnlyWantFooHere: FooBase = new Trouble();
...また、FooBase は型 T を認識しないため、そのメンバーはそれを指定できず、特殊化するには Foo でこれらの定義をオーバーライドする必要があります。
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[_]
型パラメーター type の値を返すメソッドにアクセスすると、実際にはAny
ではなくになりFoo
ます。もちろん、Foo[Foo]
2 番目の型パラメーターも欠落しており、多くのレベルしか取得できないため、どちらもFoo[Foo[_]]
実行Foo[Foo[Foo[Foo[_]]]
できません。
答えはまったくありますか、それとも Scala はこれをサポートしていませんか?
前もって感謝します!