我正在尝试在集合中使用oracle文档来获取泛型,用于上界和下界,但它会产生混淆..作为
import java.util.ArrayList;
import java.util.List;
public class Test2 {
public static void main(String[] args) {
List<Dog> dogList = new ArrayList<>();
dogList.add(new Dog());
dogList.add(new Dog());
List<Cat> catList = new ArrayList<>();
catList.add(new Cat());
catList.add(new Cat());
List<Entity> entList = new ArrayList<>();
entList.add(new Entity());
entList.add(new Entity());
print(dogList);
print(catList);
print1(entList);
}
public static void print(List<? extends Animal> animals){
for(Animal an : animals){
System.out.println(an);
}
}
public static void print1(List<? super Animal> animals){
animals.add(new Animal());
animals.add(new Dog());
for(Object an : animals){
System.out.println(an);
}
}
}
class Entity {}
class Animal extends Entity{}
class Dog extends Animal {}
class Cat extends Animal {}
现在的困惑是,即使变量属于List<? super Animal>
类型,我也可以添加狗的新实例,例如,animals.add(new Dog())
...为什么???
另外,如果我的变量是List<? extends Animal>
类型,它不允许我添加Animal,Dog或Entity的实例......任何原因??
答案 0 :(得分:0)
List<? super Animal>
是动物或实体或任何对象的列表,因此您可以添加狗。狗是动物和实体。那是
List<Object> objList = new ArrayList<>();
objList.add(new Dog());
objList.add(new Animal());
objList.add(new Entity());
objList.add(new Object());
print1(objList);
编译时没有错误或警告