无法理解如何在 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);
我想了解这两个定义的区别,以及为什么正确的是正确的,错误的是错误的。
显示编译错误的那个
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);