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

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

本问题已经有最佳答案,请猛点这里访问。

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

显示编译错误的那个

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

它给我的错误是:

1
2
3
 try2.java:8: error: incompatible types: ArrayList<ArrayList<Integer>> cannot be
converted to List<List<Integer>>
                List<List<Integer>> arr2 = new ArrayList<ArrayList<Integer>>();

工作的那个:

1
List<ArrayList<Integer>> arr = new ArrayList<ArrayList<Integer>>();

注:

我明白下面这一条为什么有效:

1
List<Integer> arr = new ArrayList<Integer>();

小精灵:

现在我只想知道List> arr2 = new ArrayList>();出了什么问题。


你不需要这些:

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

完成。

重要的是要理解:你不能创建那些"内部"列表。您只需创建一个列表(其类型为"列表列表")。稍后,您将执行以下操作:

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

例如.原因是:集合不是数组。Java允许您编写创建完全模糊的2维数组的表达式。但是集合没有多维度的概念(实现方面)!

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


正如ghostcat建议的那样,您可以使用diamond操作符,让编译器担心正确的类型。

但是,如果要了解正确的类型,请使用:

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

您正在实例化某个东西的List(让我们暂时忘记某个东西恰好是List,因此您需要创建一个实现List接口的类的实例—在本例中是ArrayList。所以你创建了一个ArrayList的实例。

元素类型(我的所谓"something")—您示例中的List—保持不变。

现在,当您想要将一个元素添加到您的List中时,您需要创建一个实现List的类的实例:

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