【问题标题】:Converting a subList of an ArrayList to an ArrayList将 ArrayList 的子列表转换为 ArrayList
【发布时间】:2013-05-14 17:35:44
【问题描述】:

我正在使用一个 ArrayList 并且我试图将它的一部分复制到另一个 ArrayList 因此我正在使用:

sibling.keys = (ArrayList<Integer>) keys.subList(mid, this.num);

其中“sibling.keys”是新的 ArrayList,“keys or this.keys”是旧的 ArrayList。 我使用了强制转换,因为 eclipse 告诉我这样做,但随后它抛出了 ClassCastException:

java.util.ArrayList$SubList 不能转换为 java.util.ArrayList

有什么建议吗?

【问题讨论】:

    标签: java arraylist sublist


    【解决方案1】:

    subList 在现有列表上返回一个视图。这不是ArrayList。您可以创建它的副本

    sibling.keys = new ArrayList<Integer>(keys.subList(mid, this.num));
    

    或者,如果您对视图行为感到满意,请尝试将 sibling.keys 的类型更改为 List&lt;Integer&gt; 而不是 ArrayList&lt;Integer&gt;,这样您就不需要复制:

    sibling.keys = keys.subList(mid, this.num);
    

    重要的是您要了解其中的区别 - 您是否要改变 sibling.keys(例如为其添加值或更改现有元素)?你要变异keys吗?您希望一个列表的突变影响另一个列表吗?

    【讨论】:

    • 另一个对我有用的简单选项是兄弟姐妹.keys.addAll(keys.subList(mid, this.num));这是假设sibling.keys 已经初始化。 addAll() 只是复制子列表的每个项目。
    • 这个问题是设备特定的吗?因为相同的代码在我的 Realme 设备上对我有效,但在三星 Galaxy S9 上无效。
    • @Lalchand:我建议你用一个完整的例子和你遇到的非常具体的错误提出一个新问题。我期望它在所有 Java 实现中都是相同的。
    【解决方案2】:

    您会收到类转换异常,因为您期望的是 ArraList,而 ArrayList.subList() 不返回 ArrayList。 将您的兄弟键从 ArrayList 更改为 List,应该可以正常工作。这将避免 ClassCastException 以及您不需要和任何演员。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2014-05-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      相关资源
      最近更新 更多