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

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

那个显示编译错误的那个

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

它给我的错误:

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

工作的那个:

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

注意:

我理解为什么下面这个有效:

 List arr = new ArrayList(); 

编辑-1

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

您可以像GhostCat建议的那样使用菱形运算符,让编译器担心正确的类型。

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

 List> arr2 = new ArrayList>(); 

你正在实例化一个List的东西(让我们忘记一下恰好是List ),所以你需要创建一个实现List接口的类的实例 – 在这种情况下是ArrayList 。 所以你创建了一个ArrayList的实例。

元素类型(我所谓的“某事物”) – 示例中的List – 保持不变。

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

 List inner = new ArrayList(); arr2.add(inner); 

你不需要任何:

 List> items = new ArrayList<>(); 

完成。

需要了解的重要事项是:您无法创建那些“内部”列表。 您只需创建一个List(具有“列表列表”)。 稍后,您会这样做:

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

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

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