我对Java泛型如何处理继承/多态性感到困惑.
假设以下层次结构 -
动物(父母)
狗 - 猫(儿童)
所以假设我有一个方法doSomething(List<Animal> animals).根据所有继承和多态的规则,我会假设a List<Dog> 是 a List<Animal>而a List<Cat> 是 a List<Animal>- 所以任何一个都可以传递给这个方法.不是这样.如果我想实现这种行为,我必须明确告诉该方法接受一个Animal的任何子类的列表doSomething(List<? extends Animal> animals).
我知道这是Java的行为.我的问题是为什么?为什么多态通常是隐含的,但是当涉及泛型时必须指定它?
我想了解两个定义之间的区别以及为什么正确的定义是正确的,错误是错误的.
那个显示编译错误的那个
List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
它给我的错误:
try2.java:8: error: incompatible types: ArrayList<ArrayList<Integer>> cannot be
converted to List<List<Integer>>
List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
正在工作的那个:
List<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
Run Code Online (Sandbox Code Playgroud)
注意:
我理解为什么下面这个有效:
List<Integer> arr = new ArrayList<Integer>();
Run Code Online (Sandbox Code Playgroud)
编辑-1:
现在我只想了解问题所在 List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();