0

私がコンパイルしようとした次のコードでは:

List<Animal> animals;
List<? extends Animal> some;
animals = some;

次のエラーが発生しました。

Type mismatch: cannot convert from List<capture#2-of ? extends Animal> to List<Animal>

しかし、含むリスト<? extends Animal>には少なくともAnimalタイプが含まれていることが保証されているのに、なぜこのエラーが発生するのでしょうか? これは、許可されている場合、ランダムなサブクラス オブジェクトAnimalを「動物」リストに入れることができるためですか、それとも何か他のものですか?

4

3 に答える 3

3

List<? extends Animal>Animalは、たとえばList<Cat>などの不明なサブタイプのすべてのインスタンスがリストに含まれていることを意味しますList<Dog>

List<Animal>Cat代わりに,Dogインスタンスの両方を含む可能性があるため、キャストは正当ではありません。

于 2012-08-17T07:30:46.050 に答える
1

List<? extends Animal>のサブタイプではないためですList<Animal>。あなたの割り当てが正当なものであれば、Dog オブジェクトを Cat のリストに追加できます。このような:

List<Animal> cats = new List<Animal>();
cats.add(new Cat());
List<Dog> dogs = cats; //if was legal
dogs.add(new Dog)); //now you have a dog in a list of cats

配列に注意してください!配列の場合、代入は正当であり、問​​題はコンパイル時ではなく実行時に発見されます。例えば:

Animal[] cats = new Animal[] {...};
Dogs[] dogs = cats; // OK at compile time
于 2012-08-17T07:30:19.083 に答える
1

私のコメントを参照してください。

List<? extends Animal>Animalは、 のいずれかまたはサブクラスである未知の型のリストであることを意味しますAnimalList<Animal>は任意Animalの を受け入れることができますが、List<Lion>( として安全に扱われますList<? extends Animal>) 明らかに受け入れられません。

これは、上限のあるワイルドカードの典型的な例です。Java チュートリアルを必ずお読みください。


List<Animal>のすべての要素を含むだけが必要な場合List<? extends Animal>は、単に行うことができます...

final List<? extends Animal> someAnimals = ...;
final List<Animal> animals = new ArrayList<Animal>(someAnimals);

これは、が を取るコンストラクタArrayListを持っているという事実を利用しています。Collection<? extends E>

于 2012-08-17T07:32:28.247 に答える