JAVA集合中的通配符

JAVA集合中的通配符,java,collections,wildcard,Java,Collections,Wildcard,爪哇。集合中的通配符 我在理解集合中的通配符时遇到了很多困难,即使在阅读了Stack Overflow和各种教程网站中的类似文章之后也是如此。下面我举了一个非常简单的例子。你能解释一下我如何在收藏,收藏和集合 package z5; import java.util.ArrayList; public class Z5 { public static class Animal{ } public static class Mammal extends Animal{ } public st

爪哇。集合中的通配符

我在理解集合中的通配符时遇到了很多困难,即使在阅读了Stack Overflow和各种教程网站中的类似文章之后也是如此。下面我举了一个非常简单的例子。你能解释一下我如何在
收藏
收藏<?扩展MyClass>
集合

package z5;
import java.util.ArrayList;
public class Z5 {
public static class Animal{
}
public static class Mammal extends Animal{   
}
public static class Reptile extends Animal{   
}
public static class Lion extends Mammal{   
}
public static class Tiger extends Mammal{   
}
public static class Snake extends Reptile{
}           
    public static void main(String[] args) {
        ArrayList<Mammal> catHouse1 = new ArrayList<Mammal>();
            catHouse1.add(new Lion());
            catHouse1.add(new Tiger());  
            catHouse1.add(new Mammal());
            catHouse1.add(new Animal()); //ERROR  
        ArrayList<? super Mammal> catHouse2 = new ArrayList<Mammal>();
            catHouse2.add(new Lion());
            catHouse2.add(new Tiger());
            catHouse2.add(new Mammal());
            catHouse2.add(new Animal()); //ERROR  
        ArrayList<? extends Mammal> catHouse3 = new ArrayList<Mammal>();
            catHouse3.add(new Lion());  //ERROR
            catHouse3.add(new Tiger());  //ERROR
            catHouse3.add(new Mammal());  //ERROR
            catHouse3.add(new Animal()); //ERROR 
        ArrayList<Mammal> zooMammals = new ArrayList<Mammal>();
            zooMammals.addAll(catHouse1);  
            zooMammals.addAll(catHouse2);  //ERROR
            zooMammals.addAll(catHouse3);
        ArrayList<Animal> zooAnimals = new ArrayList<Animal>();
            zooAnimals.addAll(catHouse1);
            zooAnimals.addAll(catHouse2);  //ERROR
            zooAnimals.addAll(catHouse3);        
    }
}
z5包;
导入java.util.ArrayList;
公共类Z5{
公共静态类动物{
}
公共静态类哺乳动物扩展动物{
}
公共静态类爬行动物{
}
公共静态类{
}
公共静态类Tiger扩展哺乳动物{
}
公共静态类爬行动物{
}           
公共静态void main(字符串[]args){
ArrayList catHouse1=新的ArrayList();
catHouse1.添加(新的Lion());
catHouse1.添加(新老虎());
catHouse1.添加(新哺乳动物());
catHouse1.add(新动物());//错误

ArrayList如果你只是想要一个可以包含
Animal
或子类
Animal
的列表,你应该使用
list
。我想这是你大部分时间都需要的

扩展:

ArrayList<? extends Mammal> list = ..

在使用
时,我不会详细介绍

列表
的意思是:此列表包含动物的实例。因此,您可以添加任何您想要的动物,并且从该列表中获取元素时,您一定会得到动物


List“大多数情况下,您使用这些通配符作为方法的参数。”谢谢,谢谢,谢谢。我试图通过创建特定类型的集合来理解这一点,但我找不到这样做的好理由(仍然找不到)。但我没有将其视为方法的参数类型。通配符使方法更可用,因为它允许许多不同的集合类型使用它们。因此,在我的主要方法中,包含爬行动物、哺乳动物和两栖动物的列表,以跟踪动物园中的所有内容,我应该将这些列表类型声明为它们特定的超类:List<哺乳动物>、List<爬行动物>、List<两栖动物>,等等。如果我有我想在所有动物身上使用的方法,我应该用通配符声明它们的参数:public double totalWeight(List
ArrayList<? extends Mammal> list = new ArrayList<Tiger>(); // List of type Tiger
ArrayList<? super Mammal> list = new ArrayList<Animal>(); // List of type Animal
Mammal m = list.get(0); // can't work because list can be a List<Animal>