gpt4 book ai didi

java - 将对象添加到 "? extends"类型的通用集合

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:10:36 24 4
gpt4 key购买 nike

public void addAllAnimals(ArrayList<? extends Animal> animalLikeList){

// I need to add animal objects (eg Dog, Cat that extends Animal) to animalLikeList.

}

我知道它不允许直接添加因为 ? extends Animal 代表 Animal 的未知子类型。

我的问题是:没有任何方法(间接方法)addaddAll 一个 AnimalAnimal 对象的子类型到 animalLikeList

最佳答案

不,没有直接合法的方法(除了不安全的类型转换)。您只能将元素添加到用 super 声明的通用集合中, 不是 extends .使用首字母缩略词 PECS(Producer - Extends,Consumer - Super)可能更容易记住,由 Josh Bloch 在 Effective Java,第二版,第 28 项中推广。 p>

事实上,您所追求的似乎没有直接意义。 List<? extends Animal>可以是例如一个List<Dog>List<Cat> .前者只能接受Dog元素,后者只有 Cat秒。并且由于您不能在 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带有 Collection<E> 的参数一次添加多个对象。

关于java - 将对象添加到 "? extends"类型的通用集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11119804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com