通配符和mutator方法

时间:2015-02-26 16:42:52

标签: java generics collections wildcard

当看到这个片段时,我感到非常困惑:

class Animal {}

class Dog extends Animal {}

public class Test {

    public static void main(String[] args) {
        List<? super Animal> list = new ArrayList<>();
        list.add(new Dog());  //it's OK
        list.add(new Animal()); //and this is OK too
    }
}

为什么允许这样的事情?当我将列表更改为List<? super Dog> list = new ArrayList<>(); list.add(new Animal());时出现编译时错误extends通配符所有组合都会导致错误。谁能说出这种行为的确切原因?提前谢谢。

1 个答案:

答案 0 :(得分:1)

    List<? super Animal> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //and this is OK too

上面的代码是允许的,因为它应该是: 因为狗也是动物。

    List<? super Dog> list = new ArrayList<>();
    list.add(new Dog());  //it's OK
    list.add(new Animal()); //error

上面的代码是错误的,因为它应该是, 因为不是每只动物都是狗。

inheritance就像这一样简单。 :)

注意:要完成答案,请参阅以下的超级好答案:

[Difference between <? super T> and <? extends T> in Java 1