使用克隆进行深层复制

时间:2014-02-07 10:11:15

标签: java list clone

我有公司对象列表。我试图克隆这个列表:

public static List<Company> cloneList(List<Company> list) {
    List<Company> clone = new ArrayList<Company>(list.size());
    for(Company item: list) clone.add(item.clone());
    return clone;
}

然而我的编译器说:

Multiple markers at this line
    - The method add(Company) in the type List<Company> is not applicable for the arguments 
     (Object)

为什么无法使用clone()进行深层复制?

4 个答案:

答案 0 :(得分:1)

问题是因为item.clone()正在返回一个Object 你可以在这里进行类型转换。所以尝试将其更改为:

clone.add((Company)item.clone());

此外,在公司课程中覆盖克隆 最简单的方法就是这个。

public Object clone(){
   return super.clone();
}

但是你也可以提出一些自定义实现。

答案 1 :(得分:1)

clone()方法在根类Object上定义(请参阅here)。它返回一个Object,因此,如果在覆盖时没有将其返回类型更改为具体类,则必须将其转换为正确的类型,例如:

clone.add((Company) item.clone());

或在类中使用协变返回类型定义clone()

public class Company implements Cloneable {
   // stuff ...

   public Company clone() throws CloneNotSupportedException { /* do clone */ }
}    

请注意,您拥有来覆盖克隆方法,因为它是在可见性受保护的情况下定义的。

  

按照惯例,实现此接口的类应使用公共方法覆盖Object.clone(受保护)。有关重写此方法的详细信息,请参阅Object.clone()。 [source]

另请参阅this问题了解其他选项。

答案 2 :(得分:1)

您感到困惑cloninggenericity

在您的情况下,您只需要将克隆转换为:

clone.add((Company)item.clone());

另外,请确保通过覆盖Object#clone方法深度克隆对象(请参阅Object.clone()

  

否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,该方法执行该对象的“浅拷贝”,而不是“深拷贝”操作。

答案 3 :(得分:-1)

clone()由Object实现并返回一个Object。覆盖类中的clone()或将结果转换为Company。

clone.add((Company) item.clone());

相关问题