質問

次の 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] }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top