在下面的代码中
public class Animal {
public void eat() {
System.out.println("Animal eating");
}
}
public class Cat extends Animal {
public void eat() {
System.out.println("Cat eating");
}
}
public class Dog extends Animal {
public void eat() {
System.out.println("Dog eating");
}
}
public class AnimalFeeder {
public void feed(List animals) {
animals.add(new Cat());
animals.forEach(animal -> {
animal.eat();
});
}
public static void main(String args[]){
List a = new ArrayList();
a.add(new Cat());
a.add(new Dog());
new AnimalFeeder().feed(a);
/* List dogs = new ArrayList<>();
dogs.add(new Dog());
dogs.add(new Dog());
new AnimalFeeder().feed(dogs); // not allowed
*/
}
}
我知道feed (List animals) 方法不能传递 List, List 等 . 如果允许 List ,那么也可以添加 animals.add(new Cat()); ,这是不可取的,因为在运行时类型擦除 . 所以只允许 List .
但是,我可以做到以下几点
List a = new ArrayList();
a.add(new Cat());
a.add(new Dog());
and still call new AnimalFeeder().feed(a);
当我运行程序时,它给了我
Cat eating
Dog eating
Cat eating
我对多态通用概念的理解是“我们希望我们的 List 只接受 List ,并且该列表仅包含动物,而不包含猫或狗,换句话说只包含动物” . 不想要任何其他包含狗或猫的东西吗?是对的吗?如果是的话,为什么我允许传递包含狗,猫等的 List . 这与传递(假设允许) List 然后将 new Cat() 添加到狗列表不一样吗?
我希望我的问题很明确 .
但我能找到问题的答案吗?
谢谢,