JAVA Generics Bounds混乱

时间:2014-01-09 05:58:48

标签: java generics collections

我正在尝试在集合中使用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的实例......任何原因??

1 个答案:

答案 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);

编译时没有错误或警告