50

我使用一个 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

有什么建议吗?

4

2 回答 2

111

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吗?您希望一个列表的突变影响另一个列表吗?

于 2013-05-20T07:45:30.930 回答
0

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

于 2013-05-20T07:51:27.490 回答