我对Java泛型如何处理继承/多态性感到困惑.
假设以下层次结构 -
动物(父母)
狗 - 猫(儿童)
所以假设我有一个方法doSomething(List<Animal> animals).根据所有继承和多态的规则,我会假设a List<Dog> 是 a List<Animal>而a List<Cat> 是 a List<Animal>- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals).
我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?
我无法理解以下文章:http: //www.ibm.com/developerworks/java/library/j-jtp01255.html
下,
泛型不是协变的
作者说,
因为ln是一个List,所以添加一个Float似乎是完全合法的.但是如果ln与li混淆,那么它将破坏li定义中隐含的类型安全承诺 - 它是一个整数列表,这就是泛型类型不能协变的原因.
我无法理解它所说的"如果ln与li混淆"的部分.作者对别名的含义是什么?(参考?).引用行上方的代码片段似乎说明了什么在java中是非法的而不是为什么.如果有人能用一个例子来解释,对我来说会很有帮助.提前致谢.