【问题标题】:Incompatible types List of List and ArrayList of ArrayList不兼容的类型 List 和 ArrayList 的 ArrayList
【发布时间】:2014-09-07 21:30:00
【问题描述】:

下面的行给了我错误:

Incompatible Types.

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

是什么原因?

编辑

我知道如果我将第二个 ArrayList 更改为 List,它不会给我错误。我想知道错误的原因。谢谢

【问题讨论】:

  • ArrayList&lt;ArrayList&lt;Integer&gt;&gt; output = new ArrayList&lt;ArrayList&lt;Integer&gt;&gt;(); 有效

标签: java list arraylist incomplete-type


【解决方案1】:

如果你有一个List&lt;List&lt;Integer&gt;&gt;,那么你就可以向它添加一个LinkedList&lt;Integer&gt;。但是你不能对ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 这样做,所以后者不可能是List&lt;List&lt;Integer&gt;&gt; 的类型。

【讨论】:

    【解决方案2】:

    来自Generics, Inheritance, and Subtypes

    这是在编程时常见的误解 泛型,但它是一个需要学习的重要概念。

    Box&lt;Integer&gt; 不是 Box 的子类型,尽管 Integer 是 Number 的子类型。

    【讨论】:

    • 这不能回答问题。问题是“原因是什么?”。您所做的只是使用不同的类重述问题的前提。
    【解决方案3】:

    Java Doc中有明确说明

    一般来说,如果 Foo 是 Bar 的子类型(子类或子接口),并且 G 是一些泛型类型声明,G&lt;Foo&gt; 不是这种情况 G&lt;Bar&gt; 的子类型。这可能是您需要做的最困难的事情 了解泛型,因为它违背了我们根深蒂固的观念 直觉。

    同样的事情发生在这里它是 Bar = List&lt;Integer&gt;Foo = ArrayList&lt;Integer&gt; 因为 ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 不是 List&lt;List&lt;Integer&gt;&gt; 的子类型

    【讨论】:

      【解决方案4】:

      原因是泛型不是covariant

      考虑更简单的情况:

      List<Integer> integers = new ArrayList<Integer>();
      List<Number> numbers = integers; // cannot do this
      numbers.add(new Float(1337.44));
      

      现在 List 包含一个浮点数,这肯定很糟糕。

      你的情况也是如此。

      List<ArrayList<Integer>> al = new ArrayList<ArrayList<Integer>>();
      List<List<Integer>> ll = al; // cannot do this
      ll.add(new LinkedList<Integer>())
      

      现在您有一个列表ll,其中包含LinkedList,但al 被声明为ArrayLists 的列表。

      【讨论】:

      • 没有突变的语言可以通过多态性获得更多乐趣。
      【解决方案5】:

      正确的写法应该是: List&lt;List&lt;Integer&gt;&gt; ret = new ArrayList&lt;List&lt;Integer&gt;&gt;(); 因为通过这种方式,您不仅可以添加ArrayList,还可以将LinkedList添加到ret

      【讨论】:

        【解决方案6】:

        更少的文本更多的修复:

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

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

        【讨论】:

        • 问题是“是什么原因”。
        猜你喜欢
        • 1970-01-01
        • 2012-10-19
        • 1970-01-01
        • 2013-08-30
        • 2013-10-29
        • 2018-03-11
        • 1970-01-01
        • 2018-10-28
        • 1970-01-01
        相关资源
        最近更新 更多