Scala - 共変型階層のルート
-
28-10-2019 - |
質問
次の 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 を認識しないため、そのメンバーは型 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
(type パラメータなし)、そうではありません。 Foo[_]
型パラメータの値を返すメソッドにアクセスすると、型は実際には次のようになります。 Any
, 、 ない Foo
. 。もちろん、私たちにはできません Foo[Foo]
2番目のタイプパラメータも欠落しているため、または Foo[Foo[_]]
または Foo[Foo[Foo[Foo[_]]]
それだけで非常に多くのレベルが得られます。
そもそも答えはあるのでしょうか、それとも Scala にはこれに対するサポートが不足しているのでしょうか?
前もって感謝します!
解決
どうでしょうか Foo[_ <: Foo[_]]
?ちなみに、これについては、あなたの他の質問への回答で言及しました。あるいは、次のように書くこともできます。
type Base = Foo[t] forSome { type t <: Foo[t] }