在Java中克隆ArrayList的警告

3
public void addProductList(ArrayList<ViewOrderProduct> globalOrderProductList) {

    this.productOrderList =  (ArrayList<ViewOrderProduct>)globalOrderProductList.clone();
}

这给我一个警告:

类型安全性:从Object到ArrayList的未经检查的转换

我知道我可以简单地通过添加@SuppressWarnings("unchecked")来解决这个问题。

但是我想了解问题所在。如果我添加suppressWarnings,我可以确保一切都很好吗?是否有另一种解决此警告的方法?


这只是一个警告,因为他无法在运行时验证您克隆的列表中是否只有“ViewOrderProduct”对象。 - Thomas Jungblut
你真的不想使用clone方法... - Luiggi Mendoza
@ThomasJungblut 不对,clone() 返回一个 Object,所以警告是正确的,与类型擦除无关。 - Neet
@Neet,你最好重新阅读一下“未经检查的转换”的定义 ;) - Thomas Jungblut
关于clone方法和克隆/复制的相关内容:https://dev59.com/P3E95IYBdhLWcg3wY9H6,https://dev59.com/J3I95IYBdhLWcg3wyBGc。现在,你的问题与警告有关,参考:https://dev59.com/F2kx5IYBdhLWcg3wAvun。 - Luiggi Mendoza
@ThomasJungblut ... 咳咳 ... 是的,你是对的。我的错^^ - Neet
2个回答

9

clone()默认返回Object,正确克隆ArrayList的方法是使用适当的构造函数:

this.productOrderList =  new ArrayList<ViewOrderProduct>(globalOrderProductList);

编辑:首选方法是使用适当的构造函数,而且这两种方法都只返回浅拷贝。

编辑:在没有@SuppressWarnings的情况下,我不知道有其他方法可以使用clone()来消除警告。


这将给你一个浅拷贝,而不是深度拷贝。当然,这取决于 OP 的需求。 - Luiggi Mendoza
1
@LuiggiMendoza ArrayList 上的 clone() 方法同样返回一个浅拷贝。 - Neet
请参考我在原帖中发布的关于clone方法使用的链接。 - Luiggi Mendoza
@LuiggiMendoza 嗯,原帖作者应该跳过整个克隆的步骤。使用构造函数是首选方式。 - Neet
简而言之,是的。但问题本身是关于使用@SuppressWarnings("unchecked")的。 - Luiggi Mendoza
全局的 globalOrderProductList 只进行了一次 .clear() 操作,所以我认为我不需要进行深度复制。 - GVillani82

0

ArrayList是Object[]的包装器,存储在其中的任何内容都被视为Object,无论使用哪个构造函数,结果都将相同。

如上所述,为了避免警告,您应该使用构造函数public ArrayList(Collection c) {}

例如:new ArrayList(globalOrderProductList);

这将返回一个没有警告的内容副本。


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