无法理解如何在java

时间:2017-07-26 06:42:18

标签: java list collections java-7 associative-array

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

显示编译错误的那个

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

的错误

2 个答案:

答案 0 :(得分:6)

你不需要任何:

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

完成。

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

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

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

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

答案 1 :(得分:4)

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

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

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

你正在实例化一个List的东西(让我们忘记一下碰巧是List<Integer>),所以你需要创建一个实现List的类的实例在这种情况下,接口 - ArrayList。因此,您创建了一个ArrayList的实例。

您的示例中的元素类型(我所谓的“某事”) - List<Integer>保持不变。

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

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