加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-14 06:03:26 所属栏目: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的未知子类型.我的问题是:是否有任何
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参数.一次添加几个对象.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读