如何轻松克隆容器(f.e.ArrayList)*?使用.clone()是不对的?

时间:2011-02-23 17:34:20

标签: java casting arraylist clone

我的,也许是天真的克隆ArrayList(Vector替换)的解决方案是

ArrayList<Double> alBis = (ArrayList<Double>) alOriginal.clone();

考虑到因为数组包含不可变的双打,我不需要 克隆它们,但只能克隆容器。

当clone()返回一个Object时,我把它放在那里,但随后 -Xlint抱怨说这是一个未经检查的演员。

那么,现在呢?用supressWarnings忽略它?创建一个新的ArrayList 用复制品复制原始元素?任何类似的库方法 Arrays.copyOf()?

我读过Unchecked cast warning,但接受的方式令人难以置信。

3 个答案:

答案 0 :(得分:13)

clone()存在重大缺陷,请参阅this Question以供参考。不要用它!

相反,所有标准集合都有复制构造函数。使用它们:

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);

<强>参考:

答案 1 :(得分:4)

  

使用.clone()?

是不对的

应尽可能避免。它是一个过时的,设计糟糕的fundamentally broken API。最好像@Sean建议的那样使用复制构造函数。

答案 2 :(得分:1)

我个人会推荐Google guava-libraries,并且:

 ImmutableCollection<Double> copy = ImmutableList.copyOf(original);

并且不要使用JRE克隆,因为它很糟糕(如果你想知道原因,那么阅读引用)。

<强>参考: