1

以下のコード:

List<? extends String> genericNames = new ArrayList<String>();
genericNames.add("John");

コンパイラエラーが発生します:

この行の複数のマーカー-タイプリストのメソッドadd(capture#1-of?extends String)は、引数(String)には適用されません-タイプリストのメソッドadd(capture#1-of?)は適用されません引数に適用可能(文字列)

このエラーの原因は何ですか?typeパラメーター内でStringを拡張しているので、Stringsまたはそのサブタイプを追加できないようにする必要がありますか?

4

3 に答える 3

12

extendsでワイルドカードを使用する場合、 null以外はコレクションに追加できません。また、Stringは最終クラスです。Stringを拡張できるものはありません。

理由:許可されている場合は、コレクションに間違ったタイプを追加している可能性があります。

例:

class Animal {

}

class Dog extends Animal {

}

class Cat extends Animal {

}

今、あなたは持っていますList<? extends Animal>

public static void someMethod(List<? extends Animal> list){
    list.add(new Dog()); //not valid
}

そして、次のようなメソッドを呼び出します。

List<Cat> catList = new ArrayList<Cat>(); 
someMethod(catList);

extendsでワイルドカードを使用するときにコレクションへの追加が許可されている場合は、Catまたはサブタイプタイプのみを受け入れるコレクションにDogを追加しただけです。したがって、上限のあるワイルドカードを使用するコレクションには何も追加できません。

于 2012-12-21T16:30:53.597 に答える
1

Stringは最終クラスであり、拡張することはできません。さらに、興味があると思われる場合は、extendsキーワードは必要ありません。 List<String>あなたが望むように見えることをします。これにより、StringとStringのサブクラスが許可されます(そのようなものが存在する可能性がある場合、Stringがfinalであるため存在できません)。

于 2012-12-21T16:47:12.067 に答える
1

Animal次のリストに任意のサブタイプのオブジェクトを追加できるGanGnaMStYleOverFlowの回答に追加したいだけです。

List<Animal> animals = new ArrayList<Animal>();

どんな種類の動物も含めることができると思うときはいつでも、そのようなリストを使用する必要があります。

一方、List<? extends Animal>リストにある種の動物が含まれていることを指定したいが、どれがどれかわからない場合に使用する必要があります。どんな動物がいるのかわからないので、追加することはできません。

于 2012-12-21T16:53:55.353 に答える