A a;
あなたはAの型パラメータ(T)の型を指定する必要があります。問題は、この行に生タイプを使用していることです。
A<B> a;
をしかし、私は、問題のあなたの文を理解していた場合、その後にも、全くジェネリックではないかもしれません。
あなたはこのような何かを行うことができます。だけでなく、おそらく便利ですにおける-間のこれらの変動のカップルがあります
class A<T extends B<? extends T>> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<? super B<T>> a;
public void event() {
a.fun(this);
}
}
:
class A<T> {
public void fun(T t) {
}
}
class B<T extends B<T>> {
A<B<T>> a;
public void event() {
a.fun(this);
}
}
かさえ、この:あなたは、おそらくこのような何かをしたいです。後者の例は最も一般的です(しかし、明らかに、最も複雑です)。
は、Aの型パラメータがBであることを保証しています。B自体が汎用で、その循環型パラメータを持つため、B<? extends T>
と言う必要があります(単にTはここでは機能しないと言います)。
class B<T extends B<T>>
は、Javaで「自己タイプ」をエミュレートするのと同じくらい近いです。これにより、Bはそれ自体の(ほぼ)具体的なサブタイプについて話すことができます。 Bをサブクラス化するときは、「class C extends <B<C>>
」のようなものがあります。これは、C.a
のタイプが実際にはA<? super B<C>>
であるため、便利です。
後者の例の? super
ビットは、A
と同じタイプのB
ではないBを接続する予定がある場合にのみ役立ちます。具体的に考えてみると、A<Shape>
とCircle
(Shape
を拡張してB
に拡張しています)とします。スーパーワイルドカードを使用すると、それらを一緒に使用できます。それがなければCircle
のではなくA<Circle>
が必要です。
私が見ることができる唯一の警告は、生の種類としてAの使用です。それがあなたが参照している警告でない場合は、より具体的に、どのコンパイラを使用しているか教えてください。 – skaffman