首页 文章

泛型在java中的子类行为

提问于
浏览
1

嗨我在下面的代码中有一个查询 .

当我宣布动物名单时,它允许我将Cat()和Dog()放入其中,因为它们都是动物并且满足IS A关系船 .

Class Cat extends Animal{}
Class Dog extends Animal{}

List<Animal> list = new ArrayList<Animal>();
list.add(new Dog());//Code works fine
list.add(new Cat());//Code works fine

现在这里是我的问题,如果 ? extends 表示接受任何动物的子类,那么为什么跟随代码不编译 .

List<? extends Animal> list = new ArrayList<Animal>();
list.add(new Dog());//Compilation fails 
list.add(new Cat());//Compilation fails

同样的问题,为什么这里不接受狗?

List<? extends Animal> dogs1 = new ArrayList<Dog>();
dogs1.add(new Dog());//Compilation fails

有人可以解释这种行为吗?

1 回答

  • 2

    可以为 List<? extends Animal> 类型的变量分配 List<Animal>List<Cat>List<Dog> . 其中一些列表不允许添加 Dog ,而其他列表不允许 Cat .

    编译器根据 list 变量的编译时类型验证 list.add 语句的正确性,而不是基于运行时分配给它的实际对象 . 因此,不接受 list.add(new Dog());list.add(new Cat()); .

    如果您希望能够同时添加 DogCat ,请使用 List<Animal> 类型的变量 .

    如果您希望只能添加 Dog ,请使用 List<Dog> 类型的变量 .

相关问题