2つのクラスAとBがあり、BがAのサブタイプであるとします。これは明らかに、より豊富なタイプ階層の一部にすぎませんが、関連性はないと思います。Aが階層のルートであると想定します。Aのリストを追跡するコレクションクラスCがあります。ただし、Cをジェネリックにしたいので、Bのみを保持し、Aを受け入れないインスタンスを作成できます。
class A(val c: C[A]) {
c.addEntry(this)
}
class B(c: C[A]) extends A(c)
class C[T <: A]{
val entries = new ArrayBuffer[T]()
def addEntry(e: T) { entries += e }
}
object Generic {
def main(args : Array[String]) {
val c = new C[B]()
new B(c)
}
}
上記のコードは明らかにエラー「タイプの不一致:C [B]が見つかりました、行にC[A]が必要です」を示していnew B(c)
ます。
これをどのように修正できるかわかりません。ArrayBufferはTで非バリアント型であるため、 TでCを共変にすることはできません(のようにC[+T <: A]
)。Cは共変ではないため、BのコンストラクターにC[B]を要求させることはできません。
ここで間違った木を吠えていますか?私は完全なScala初心者なので、アイデアやヒントが役立つかもしれません。ありがとうございました!
編集:基本的に、私が欲しいのは、コンパイラが両方を受け入れることです
val c = new C[B]()
new B(c)
と
val c = new C[A]()
new B(c)
しかし拒否します
val c = new C[B]()
new A(c)
CでのArrayBufferの入力をTではなくAに緩和することはおそらく可能です。したがって、それが役立つ場合は、addEntryメソッドでも同様です。