我对 Java 泛型如何处理继承/多态性感到有点困惑。
假设以下层次结构 -
动物(父母)
狗- 猫(儿童)
所以假设我有一个方法 doSomething(List<Animal> animals)
。 By all the rules of inheritance and polymorphism, I would assume that a List<Dog>
is a List<Animal>
and a List<Cat>
is a List<Animal>
- and所以任何一个都可以传递给这个方法。不是这样。如果我想实现这种行为,我必须通过说 doSomething(List<? extends Animal> animals)
明确告诉该方法接受 Animal 的任何子类的列表。
我明白这是 Java 的行为。我的问题是 _为什么_?为什么多态一般都是隐式的,但是涉及到泛型就一定要指定?
原文由 froadie 发布,翻译遵循 CC BY-SA 4.0 许可协议
不,
List<Dog>
不是List<Animal>
。考虑一下你可以用List<Animal>
做什么——你可以向它添加 任何 动物……包括猫。现在,你能合乎逻辑地将一只猫添加到一窝小狗中吗?绝对不。突然你有一只 非常 困惑的猫。
现在,您 不能 将
Cat
添加到List<? extends Animal>
因为您不知道它是List<Cat>
。您可以检索一个值并知道它将是Animal
,但您不能添加任意动物。对于List<? super Animal>
则相反 - 在这种情况下,您可以安全地向其添加Animal
,但您不知道可以从中检索到什么,因为它可能是一个List<Object>
。