我想了解这两个定义之间的区别,以及为什么正确的定义是正确的,错误是错误的。
显示编译错误的那个
List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();
它给我的错误:
try2.java:8: error: incompatible types: ArrayList<ArrayList<Integer>> cannot be
converted to List<List<Integer>>
List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();
正在运作的那个:
List<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();
注意:
我明白为什么下面这个有效:
List<Integer> arr = new ArrayList<Integer>();
编辑-1 :
现在我只是想了解List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();
答案 0 :(得分:6)
你不需要任何:
List<List<Whatever>> items = new ArrayList<>();
完成。
要理解的重要事项:您可以不创建那些“内部”列表。您只需创建一个List(具有“列表列表”)。稍后,你会这样做:
List<Whatever> innerItems = new ArrayList<>();
items.add(innerItems);
例如,。原因是:集合是不数组。 Java允许您写下创建完整的2-Dim数组的表达式。但是集合没有多维度的概念(实现方式)!
其中一部分是泛型实际上是使用类型擦除实现的。这意味着:实际的列表实现不知道您在源代码中使用的泛型类型。它只处理Object
的实例。从这个意义上讲,实现“不可能”知道新List应该包含List<Whatever>
。
答案 1 :(得分:4)
您可以像GhostCat建议的那样使用菱形运算符,让编译器担心正确的类型。
但是如果你想了解正确的类型应该是什么,请使用:
List<List<Integer>> arr2 = new ArrayList<List<Integer>>();
你正在实例化一个List
的东西(让我们忘记一下碰巧是List<Integer>
),所以你需要创建一个实现List
的类的实例在这种情况下,接口 - ArrayList
。因此,您创建了一个ArrayList
的实例。
您的示例中的元素类型(我所谓的“某事”) - List<Integer>
保持不变。
现在,当您想要向List
添加元素时,您需要创建一个实现List<Integer>
的类的实例:
List<Integer> inner = new ArrayList<Integer>();
arr2.add(inner);