上限ワイルドカードは型Tのコレクションのは、次のような構造
class Animals{}
class Dog extends Animals{}
class Cat extends Animals{}
class Container<T>{
void add(T t){};
void addAll(Collection<T> t){};
}
を見てみましょうするために必要であり、我々はそれをインスタンス化し、この
ArrayList<Dog> dogs = new ArrayList<>();
dogs.add(new Dog());
ArrayList<Cat> cats = new ArrayList<>();
cats.add(new Cat());
Container<Animals> animalContainer = new Container<>();
animalContainer.add(dogs.get(0)); // will work since add(T t)
animalContainer.addAll(cats); // will not work since addAll(Collection<T> t)
理由のようにそれを使用するようにaddAll(Collection<T> t)
とはうまくいかない理由は、コンテナがタイプT
(Animal
)のみを受け入れることですが、catリストのタイプがCat
なので、それはコンプライアンス違反ですtraints。 Animal
ので
はDog
、Cat
、AnyOtherConcreteAnimal
であることができます。上限ワイルドカード
void addAll(Collection<? extends T> t){};
にそれを変更することであなたはAnimals
の具体的なタイプのコレクションを期待していないだけT
Container<Animals>
であることを言います。そして、これは再び働くでしょう
animalContainer.addAll(cats); // will work since addAll(Collection<? extends T> t)
Eを拡張するものもすべてEです。しかし、ジェネリックは不変であるため、同じ原則は当てはまりません。 – bcsb1001
@ bcsb1001ここで、不変性とは、「Collection」が「Collection 」ではないことを意味します。 https://stackoverflow.com/q/2745265/3788176を参照してください。 (あなたの利益ではなくOPの利益のために提供されています;あなたのコメントからちょうど後に続きます:) –