AとBの2つのクラスがあり、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)
}
}
は明らかエラー与える上記コード:new B(c)
行に '型の不一致は、Cは、[B]、C [A]を必要見出さ'。
これを修正する方法がわかりません。 ArrayBufferはTに型が変わっていないので、TでC共変を作ることはできません(BのコンストラクタにC [B]が必要です).Cは共変できないためです。
ここで間違った木を吠えていますか?私はScala初心者ですから、どんなアイデアやヒントも参考になるかもしれません。ありがとうございました!
EDIT: 基本的に、私がしたいのですが、コンパイラは
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メソッドも役立ちます。
Cが共変型である場合、ここで説明する理由は間違いですが、厳密には要件ではありません。 C [B]をC [A]のサブタイプにする必要はないと思います。 – Verhoevenv
@Verhoevenvもし 'C [B]'が 'C [A]'のサブタイプでなければ、 'C [B]'型の 'c'が' '新しいB(c) ?私はあなたのリビジョンを今見ていて、あなたは何か不可能なことを求めています。 –