【问题标题】:Warning cloning ArrayList in Java警告在 Java 中克隆 ArrayList
【发布时间】:2013-12-07 11:37:30
【问题描述】:
public void addProductList(ArrayList<ViewOrderProduct> globalOrderProductList) {

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

这给了我警告:

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

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

但我想了解问题所在。如果我添加了 suppressWarnings,我可以确定一切顺利?此警告是否有其他解决方案?

【问题讨论】:

标签: java object arraylist clone suppress-warnings


【解决方案1】:

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

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

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

编辑:我知道没有其他方法可以使用 clone() 删除警告而不使用 SuppressWarning

【讨论】:

  • 这会给你一个浅拷贝,而不是一个深度拷贝。当然,这取决于 OP 的需求。
  • @LuiggiMendoza clone() on ArrayList 也返回浅拷贝。
  • 请参阅我在 OP 的问题中发布的关于clone 方法用法的链接。
  • @LuiggiMendoza 好吧,OP 应该跳过整个克隆的事情。无论如何,使用 ctor 是首选方式。
  • 简而言之,是的。但问题本身是关于使用@SuppressWarnings("unchecked")
【解决方案2】:

arraylist 是 Object[] 的封装,里面的任何东西都存储为 Object,不管用什么构造函数,结果都是一样的。

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

例如 new ArrayList(globalOrderProductList);

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

【讨论】:

    猜你喜欢
    • 2021-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2018-01-28
    • 2010-10-17
    相关资源
    最近更新 更多