无法理解如何在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
是不可能的。