将ArrayList的子列表转换为ArrayList

54

我正在使用一个ArrayList,试图将其部分内容复制到另一个ArrayList中,因此我使用:

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

“sibling.keys”是新的ArrayList,“keys或this.keys”是旧的ArrayList。我使用了强制类型转换,因为Eclipse告诉我这样做,但是它会抛出一个“ClassCastException”的错误:

java.util.ArrayList$SubList无法转换为java.util.ArrayList

有什么建议吗?

2个回答

118

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

subList 返回的结果是原列表的一个子列表视图,并非新的ArrayList对象。如果需要一个独立于原列表的新列表,可以通过将该子列表转换为一个新的列表实例来创建其副本。

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

如果您对查看行为感到满意,那么请尝试将sibling.keys的类型更改为List<Integer>而不是ArrayList<Integer>,这样您就不需要进行复制:

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

然而,你需要明白它们的区别 - 你是否将要改变sibling.keys(例如在其中添加值或更改现有元素)?你是否将要改变keys?你想让一个列表的改变影响到另一个列表吗?


2
另一个对我有效的简单选项是 sibling.keys.addAll(keys.subList(mid, this.num));这假定 sibling.keys 已经被初始化。addAll() 简单地复制子列表中的每个项目。 - Joshua M
这个问题是特定于设备的吗?因为同样的代码在我的Realme设备上可以运行,但在三星Galaxy S9上却不能。 - Lalchand
@Lalchand:我建议您提出一个新问题,包括完整的示例和您遇到的非常具体的错误。我会期望它在所有Java实现中都是相同的。 - Jon Skeet

0
你会遇到类转换异常,因为你期望得到一个ArrayList,而ArrayList.subList()并不返回ArrayList。 将你的sibling.keys从ArrayList改为List,就可以正常工作了。这样做可以避免ClassCastException,也不需要进行任何强制类型转换。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接