【问题标题】:Assigning ArrayList<List<Integer>> with an ArrayList<ArrayList<Integer>> [duplicate]用 ArrayList<ArrayList<Integer>> 分配 ArrayList<List<Integer>> [重复]
【发布时间】:2017-10-24 23:23:04
【问题描述】:

为什么我不能将ArrayList&lt;ArrayList&lt;Integer&gt;&gt; 分配给ArrayList&lt;List&lt;Integer&gt;&gt;,如下所示:

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

不是所有的 ArrayLists 都是列表,因此我可以在哪里放置一个列表,我也可以放置一个 ArrayList?

【问题讨论】:

    标签: java generics arraylist


    【解决方案1】:

    如果这是合法的,您可以执行以下操作:

    ArrayList<ArrayList<Integer>> y = new ArrayList<>();
    ArrayList<List<Integer>> x = y;  // Compiler error! Pretend it's OK, though.
    
    x.add(new LinkedList<>());  // Fine, because a LinkedList<Integer> is a List<Integer>
    

    但是这会失败:

    ArrayList<Integer> a = y.get(0);  // ClassCastException!
    

    因为y 的第一个元素是LinkedList,而不是ArrayList

    如果x的类型是,你可以将y分配给x

    ArrayList<? extends List<Integer>>`
    

    因为您无法在该列表中添加任何内容(除了文字 null),因此不会出现 ClassCastException

    【讨论】:

      【解决方案2】:

      因为如果x 被键入为ArrayList&lt;List&lt;Integer&gt;&gt;,那么您可以将任何类型的列表填充到x,所以这应该是合法的:

      x.add(new LinkedList<Integer>());
      

      但如果x 实际上是ArrayList&lt;ArrayList&lt;Integer&gt;&gt;,那不应该被允许。

      这是允许的:

      ArrayList<? extends List<Integer>> x = new ArrayList<ArrayList<Integer>>();
      

      但是使用x 的定义,您实际上无法将任何内容放入x

      【讨论】:

        猜你喜欢
        • 2019-08-24
        • 2014-01-03
        • 2015-05-29
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        • 1970-01-01
        相关资源
        最近更新 更多