Sergey94:
このような場合を考えてみます。
class A {}
class B<T extends A, E extends T> {
B<?, A> b;
B<?, ? extends A> b2;
}
私はこの場合には、両方の効果的な上限をタイプ限界を理解するようにT
、およびE
ありますclass A
。そこで質問:なぜのjavacは、フィールドの宣言で、引数としてクラスAを受け入れていないb
が、受け入れるwildcard
? extends A
フィールドの宣言にb2
?
xtratic:
以下のクラスの場合:
class A {}
class C extends A {}
class B<T extends A, E extends T> {}
このように考えて:
E extends T extends A
でB<?,A>
、その後T -> ?
とE -> A
A extends ? extends A
はどこ?
の任意のサブクラスである可能性がありA
、聞かせてのは言いますC
。
A extends C extends A
明らかに無効です。
それはコンパイルエラーだ理由ですので。
Eclipseユーザーのための注:
Eclipseの4.9.0コンパイラがのjavac 8UとのIntelliJに反対し、中ジェネリック引数にコンパイルエラーを生成しませんでしたB<?,A>
。私は、これはEclipseのコンパイラのバグであると仮定が、私はこれを確認するために、JLSに相談していません。
class B<T extends A, E extends T> {
B<?, A> b; // <-- Eclipse does NOT emit a compile error
B<?, ? extends A> b2;
}
この仮定バグが報告されているここに。