いいえ、直接的な合法的な方法はありません (安全でない型のキャストは別として)。super
ではなく、で宣言されたジェネリック コレクションにのみ要素を追加できますextends
。これは、 Effective Java, 2nd Edition , Item 28で Josh Bloch によって一般化された頭字語PECS (Producer - Extends, Consumer - Super) で覚えやすいかもしれません。
実際、あなたが求めているように見えるものは、直接的な意味をなさないようです. AList<? extends Animal>
は、たとえば aList<Dog>
または aにすることができますList<Cat>
。Dog
前者は要素のみを受け入れることができ、後者はCat
s のみを受け入れることができます。また、Java ではジェネリック (非具体化可能) 型をインスタンス化できないため、実行時に犬のリストを扱っていることを認識しておく必要があります。そのため、犬をリストに追加しようとするだけです (猫の場合はその逆)。つまり、追加するオブジェクトをローカルで静的に作成することはできません。一般的な方法でオブジェクトを取得する必要があります。これを行う最も簡単な方法は、要素をジェネリック パラメータとして渡すことです。したがって、これを行うことは可能で安全です:
public <E extends Animal> void addAllAnimals(List<E> animalLikeList, E animal) {
animalLikeList.add(animal);
}
List<Dog> dogs = new ArrayList<Dog>();
List<Cat> cats = new ArrayList<Cat>();
addAllAnimals(dogs, new Dog());
addAllAnimals(cats, new Cat());
このメソッドはジェネリックであり、名前付きの型パラメーターを使用することに注意してください。これにより、リストの実際のジェネリック型は、リストに追加される要素の型と同じになります。
一度に複数のオブジェクトを追加するには、E
パラメータを aに簡単に置き換えることができます。Collection<E>