无法理解如何在 java 中定义列表列表

Not able to understand how to define a List of List in java

我想了解这两个定义的区别,以及为什么正确的是正确的,错误的是错误的。

显示编译错误的那个

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>>();

有什么问题

你不需要这些:

List<List<Whatever>> items = new ArrayList<>();

完成。

需要了解的重要一点:您可以创建那些"inner"列表。您只需创建一个列表(类型为 "list of lists")。稍后,你会做:

List<Whatever> innerItems = new ArrayList<>();
items.add(innerItems);

例如。原因是:集合是 而不是 数组。 Java 允许您写下创建完整二维数组的表达式。但是集合没有多维度的概念(实现方面)!

部分原因是泛型实际上是使用 类型擦除 实现的。这意味着:实际的列表实现对您在源代码中使用的泛型类型一无所知。它只处理 Object 的实例。从这个意义上讲,新列表应该包含 List<Whatever> 的实现 "knows" 是不可能的。

您可以按照 GhostCat 的建议使用菱形运算符,让编译器担心类型是否正确。

但是如果您想了解正确的类型应该是什么,请使用:

List<List<Integer>> arr2 = new ArrayList<List<Integer>>(); 

您正在实例化某物的 List(让我们暂时忘记某物恰好是 List<Integer>),因此您需要创建一个 class 的实例实现 List 接口 - 在本例中为 ArrayList。所以你创建了一个 ArrayList 的实例。

元素类型(我所谓的 "something")- 在您的示例中 List<Integer> - 保持不变。

现在,当您想向 List 添加元素时,您需要创建一个 class 的实例来实现 List<Integer>:

List<Integer> inner = new ArrayList<Integer>();
arr2.add(inner);