Javaでワイルドカードとタイプpameter境界

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;
}

この仮定バグが報告されているここに

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=176700&siteId=1