java Generics polymorphism
在下面的代码中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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<Animal> animals) { animals.add(new Cat()); animals.forEach(animal -> { animal.eat(); }); } public static void main(String args[]){ List<Animal> a = new ArrayList<Animal>(); a.add(new Cat()); a.add(new Dog()); new AnimalFeeder().feed(a); /* List<Dog> dogs = new ArrayList<>(); dogs.add(new Dog()); dogs.add(new Dog()); new AnimalFeeder().feed(dogs); // not allowed */ } } |
我知道fe
但是,我可以做以下操作
1 2 3 4 | List<Animal> a = new ArrayList<Animal>(); a.add(new Cat()); a.add(new Dog()); and still call new AnimalFeeder().feed(a); |
当我运行程序时,它给了我
1 2 3 | Cat eating Dog eating Cat eating |
我对多态通用概念的理解是"我们想要我们的
我希望我的问题是清楚的。
我确实经历过list
但我能找到我问题的答案吗?
谢谢,
My understanding of polymorphic generic concept is that"we want our List to accept only List
真
and also that that List contain only Animals, not Cat or Dog
不是真的
另一方面,当您使用
我们先不要把自己和仿制药混淆。考虑一下:
1 | Animal cat = new Cat(); |
这是允许的,因为
换言之,类型为
回到泛型:
1 | List<Animal> animals = new ArrayList<>(); |
一般情况和非一般情况的区别在于,一般情况只确保编译时的类型-在运行时清除该类型,因此