1

次のコードの何が問題になっているのか、具体的には、なぜがと<A extends ClassA>同等ではないのか理解できません<? extends ClassA>

bar()電話できないのfoo()

コンパイラは、メソッドfoo(...)は引数(...)には適用できない
と言います( 正確なエラーは以下のコメントで指定されています)

static class ClassA {};
static class ClassB<A extends ClassA> {};

private static <A extends ClassA> Collection<ClassB<A>> foo(Collection<ClassB<A>> as) {
    return as;
}

private Collection<ClassB<? extends ClassA>> bar(Collection<ClassB<? extends ClassA>> as) {
    // Error:
    // The method foo(Collection<ClassB<A>>) is not applicable 
    // for the arguments (Collection<ClassB<? extends ClassA>>)
    return foo(as);
}

ありがとう!

4

2 に答える 2

2

理由は正確にはわかりませんが、2番目のメソッドにジェネリック型を追加する必要があります:)

private <T extends ClassA> Collection<ClassB<T>> bar(Collection<ClassB<T>> as) {
    return foo(as);
}
于 2012-08-22T16:30:55.517 に答える
2

Collection<ClassB<? extends ClassA>>問題は、あるタイプの何かをあるタイプの何かに渡そうとしていることですCollection<ClassB<A>>。それらは互換性がありません。

2つのジェネリック型に互換性を持たせるには、どちらもワイルドカードでない場合、それらの型パラメーターが完全に一致する必要があります。ここで、型パラメーターはClassB<? extends ClassA>and ClassB<A>(一部の場合A)です。どちらもワイルドカードではなく、まったく同じになることはありません。何Aであれ、特定のタイプを表します。ClassB<A>(何であれ)のサブタイプAになるのは事実です。しかし、それは関係ありません-のサブタイプと同じように、互換性はありません。ClassB<? extends ClassA>StringObjectCollection<String>Collection<Object>

少しジェネリックにするfoo()と、ジェネリックパラメータがトップレベルになります。

private static <T extends ClassB<? extends ClassA>> Collection<T> foo(Collection<T> as) {
    return as;
}

次に、キャプチャを使用してこれを行うことができます。

private Collection<? extends ClassB<? extends ClassA>> bar(Collection<? extends ClassB<? extends ClassA>> as) {
    return foo(as);
}
于 2012-08-22T20:12:39.630 に答える