不,没有直接的合法方式(除了不安全的类型转换)。您只能将元素添加到用 声明的通用集合super
,而不是extends
。使用 Josh Bloch 在Effective Java, 2nd Edition , Item 28中推广的首字母缩写词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
参数替换为 aCollection<E>
以一次添加多个对象。