Java 将对象添加到";?扩展;泛型集合的类型 public void addAllAnimals(ArrayList)

Java 将对象添加到";?扩展;泛型集合的类型 public void addAllAnimals(ArrayList),java,generics,collections,Java,Generics,Collections,我的问题是:是否有任何方式(间接方式)将所有动物或动物对象的子类型添加到动物列表中 如果不更改签名,这是有充分理由的。假设您想向该列表添加Dog值……但假设它在逻辑上是一个猫的列表: public void addAllAnimals(ArrayList<? extends Animal> animalLikeList){ // I need to add animal objects (eg Dog, Cat that extends Animal) to animalLike

我的问题是:是否有任何方式(间接方式)将所有动物或动物对象的子类型添加到动物列表中

如果不更改签名,这是有充分理由的。假设您想向该列表添加
Dog
值……但假设它在逻辑上是一个猫的列表:

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

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

}


public void addAllAnimals(ArrayList否,除了不安全的类型转换之外,没有直接合法的方法)。您只能将元素添加到使用
super
,而不是
extends
声明的泛型集合中。使用首字母缩略词PECS(Producer-extends,Consumer-super)可能更容易记住这一点,由Josh Bloch在有效Java中推广,第2版,第28项

事实上,你所追求的似乎没有直接意义; 添加动物(列表);
这是完全有效的。您的方法
addAllAnimals
将接受声明包含任何动物子类型的任何arrayList


为了添加一个对象/列表,您可以选择任何对象/列表来显示动物的子类型。

不是以类型安全的方式

一个想法是将签名更改为:

ArraList<anything extends animal> list= new ArrayList<anything extends animal>();


addAllAnimals(list);

publicstaticvoidaddallanimals(ArrayList为什么不简单地更改方法签名以使用不变类型参数

public static <T extends Animal> void addAllAnimals(ArrayList<? super T> list){}
public void addAllAnimals(ArrayList animalikelist){
animalLinkedList.add(newdog());
animalLinkedList.add(newcat());
}
它应该工作得很好,通过使用不变类型参数,您可以从列表中读取或写入,并且根据子类型pollymorphism的规则,它可以包含您想要的任何类型的动物


不要试图传递狗列表或猫列表,而是将动物列表传递给该方法。

您可以使用非通用方式将所有添加到通用集合中

public void addAllAnimals(ArrayList<Animal> animalLikeList){
   animalLinkedList.add(new Dog());
   animalLinkedList.add(new Cat());

}

public void testextens(ArrayListI对其进行了快速编辑。我想知道是否有任何方法(任何顽皮的方法)向其添加元素。或者这真的是不可能的!如果您打算违反其限制,为什么要使用通配符,这毫无意义?我正在传递不同的动物列表(ArrayList,ArrayList)到addAllAnimals方法。这就是我使用addAllAnimals的原因(ArrayList那么,如果你在狗的列表中添加一只猫,你怎么能确定你不会犯堆污染呢?这就是本例中通配符限制的全部目的。它是为了保护你的数据,而你想要违反它,这表明你的观点不正确Edwin。+1并同意!谢谢Jon。但我通过了di与addAllAnimals方法不同的动物列表(ArrayList,ArrayList)。这就是我使用addAllAnimals的原因(ArrayList@NamalFernando当前位置:那么您希望如何将
狗添加到
addAllAnimals
的列表中?如果您尝试将
狗添加到
数组列表中,您希望发生什么?您看到您是如何遇到一个基本问题的吗?@NamalFernando Jon几乎已经说出了关于这一问题的所有内容。没有安全的方法可以添加到这样的类型的列表中。是的,Jon和Jarkko。我完全同意你的观点。我想知道的是“有没有办法将动物或动物对象的子类型添加到动物列表中?以上述方式或其他方式。+1为您的观点和很好的解释。我认为这甚至不会编译威尔,在“任何扩展动物”的地方可能会有狗、猫等。我不明白为什么它不会编译。”
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());
ArraList<anything extends animal> list= new ArrayList<anything extends animal>();


addAllAnimals(list);
public static <T extends Animal> void addAllAnimals(ArrayList<? super T> list){}
public void addAllAnimals(ArrayList<Animal> animalLikeList){
   animalLinkedList.add(new Dog());
   animalLinkedList.add(new Cat());

}
public void testExtends(ArrayList<? extends Parent> list) throws Exception {
    /*  list.add(new Child());
        list.add(new Parent());
        list.add(new GrandParent());
        // can not add
        */
        /**
         * Unsafe collection way
         */
        ArrayList list2=new ArrayList();
        list.addAll(list2);
    }