【问题标题】:Not able to understand how to define a List of List in java [duplicate]无法理解如何在java中定义列表列表[重复]
【发布时间】:2018-01-01 07:49:15
【问题描述】:

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

显示编译错误的那个

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

Edit-1

现在我只想了解List&lt;List&lt;Integer&gt;&gt; arr2 = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;();有什么问题

【问题讨论】:

  • 看看编译后的类型擦除:docs.oracle.com/javase/tutorial/java/generics/…
  • 对于Arraylist的初始化,只需将其设为new ArrayList&lt;&gt;()并省略类型即可,List&lt;List&lt;Integer&gt;&gt;的变量定义足以保证类型正确
  • @SomeJavaGuy 他试图理解,而不是修复
  • @pivovarit 他可以保留类型,这是可以理解的,因为没有必要包含它,另一件事是,这是他的编译错误,而不是继承相关,不是每个 @ 987654330@ 是ArrayList
  • List&lt;List&lt;Integer&gt;&gt; arr2 = new ArrayList&lt;List&lt;Integer&gt;&gt;();

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


【解决方案1】:

你不需要这些:

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

完成。

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

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

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

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

【讨论】:

  • 但是为什么。 OP 试图了解原因
  • 我同意这实际上很难解释。暂时放下一些东西;但我会考虑更多。
【解决方案2】:

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

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

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

您正在实例化某事物的List(让我们暂时忘记某事物恰好是List&lt;Integer&gt;),因此您需要创建一个实现List 接口的类的实例——ArrayList在这种情况下。所以你创建了一个 ArrayList 的实例。

元素类型(我所谓的“某物”) - 在您的示例中为 List&lt;Integer&gt; - 保持不变。

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

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

【讨论】:

  • @Eran。我几乎得到了你想要解释的东西。但是我所做的不是像您那样单独编写它(List inner = new ArrayList()),而是将所有内容写在一行中。 List>arr = new ArrayList>() 有什么问题
  • @Manya ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 不是List&lt;List&lt;Integer&gt;&gt; 的子类,也没有实现List&lt;List&lt;Integer&gt;&gt;。因此你不能做这个任务。 ArrayList&lt;ArrayList&lt;Integer&gt;&gt;List&lt;ArrayList&lt;Integer&gt;&gt; 的实现。
  • @Eran 。是的。现在你的这个评论使一切都完成了。非常感谢您的解释。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-13
  • 2020-12-13
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 2019-04-05
  • 2016-04-06
相关资源
最近更新 更多