当看到这个片段时,我完全困惑了:
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
通配符所有组合都会导致错误。谁能说出这种行为的确切原因?提前致谢。
最佳答案
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
上面的代码是一个错误,它应该再次出现, 因为并非所有动物都是狗。
继承
就这么简单。 :)
注意:为了完成答案,我引用了这个 super 好的答案:
关于java - 通配符和变异方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28747956/