2

次の 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 はこれをサポートしていませんか?

前もって感謝します!

4

1 に答える 1

5

どうFoo[_ <: Foo[_]]ですか?ちなみに、他の質問への回答で言及しました。または、次のように書くこともできます。

type Base = Foo[t] forSome { type t <: Foo[t] }
于 2011-06-17T06:48:24.757 に答える