public void addAllAnimals(ArrayList<? extends Animal> animalLikeList){ // I need to add animal objects (eg Dog,Cat that extends Animal) to animalLikeList. }
我知道它不允许直接添加? extends Animal代表Animal的未知子类型.我的问题是:是否有任何方法(间接方式)向AnimalLikeList添加或添加动物对象的Animal或子类型?
解决方法
不,没有直接的合法方式(除了不安全的类型演员).您只能将元素添加到使用super声明的泛型集合,而不是扩展.这可能更容易记住,首字母缩略词PECS(Producer – Extends,Consumer – Super),由Josh Bloch在Effective Java,第2版,第28项中推广.
事实上,你似乎追求的似乎没有直接意义.列表<?延伸动物>可以是例如列表< Dog>或列表< Cat>.前者只能接受Dog元素,后者只能接受Cats.并且由于您无法在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());
请注意,此方法是通用的,具有命名类型参数,可确保列表的实际泛型类型与要添加到其中的元素类型相同.
您可以使用Collection< E>简单地替换E参数.一次添加几个对象.