java – 将对象添加到“?扩展“通用集合的类型

前端之家收集整理的这篇文章主要介绍了java – 将对象添加到“?扩展“通用集合的类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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参数.一次添加几个对象.

猜你在找的Java相关文章