- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 Java 泛型如何处理继承/多态性有点困惑。
假设以下层次结构 -
动物(父级)
狗 - 猫( child )
假设我有一个方法 doSomething(List<Animal> animals)
。根据继承和多态性的所有规则,我假设 List<Dog>
是 List<Animal>
和一个 List<Cat>
是 List<Animal>
- 所以任何一个都可以传递给这个方法。并非如此。如果我想实现这种行为,我必须明确告诉该方法接受 Animal 的任何子类的列表,方法是 doSomething(List<? extends Animal> animals)
。
我明白这是Java的行为。我的问题是为什么?为什么多态性一般是隐式的,但是当涉及到泛型时就必须指定它?
最佳答案
不,一个List<Dog>
是不是 List<Animal>
。考虑一下您可以用List<Animal>
做什么- 您可以向其中添加任何动物...包括猫。现在,你能合乎逻辑地将一只猫添加到一窝小狗中吗?绝对不是。
// Illegal code - because otherwise life would be Bad
List<Dog> dogs = new ArrayList<Dog>(); // ArrayList implements List
List<Animal> animals = dogs; // Awooga awooga
animals.add(new Cat());
Dog dog = dogs.get(0); // This should be safe, right?
突然间,你有了一只非常困惑的猫。
现在,您无法添加 Cat
到 List<? extends Animal>
因为你不知道这是一个List<Cat>
。您可以检索一个值并知道它将是 Animal
,但不能添加任意动物。 List<? super Animal>
则相反。 - 在这种情况下,您可以添加 Animal
安全地访问它,但您不知道可以从中检索什么,因为它可能是 List<Object>
.
关于java - List<Dog> 是 List<Animal> 的子类吗?为什么 Java 泛型不是隐式多态的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62177496/
我是一名优秀的程序员,十分优秀!