通配符和修改器方法
Wildcard and mutator methods
当我看到这段代码时,我完全糊涂了:
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
上面的代码是错误的,应该是错误的,
因为不是所有的动物都是狗。
inheritance
就是这么简单。 :)
注意:为了完成答案,我参考了这个超级好的答案:
[Difference between <? super T> and <? extends T> in Java1
当我看到这段代码时,我完全糊涂了:
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
上面的代码是错误的,应该是错误的, 因为不是所有的动物都是狗。
inheritance
就是这么简单。 :)
注意:为了完成答案,我参考了这个超级好的答案:
[Difference between <? super T> and <? extends T> in Java1