2014-02-07 87 views
0

我有一个公司对象列表。我试图克隆此列表:使用克隆进行深层复制

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()

回答

1

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

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

或定义clone()在你的类作为协变返回类型:

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

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

请注意,您覆盖,因为它与知名度保护规定的克隆方法。

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

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

+0

Thx为您的答案!不过,我的编译器现在让我回想起来:'类型Object中的方法clone()不可见“# – user2051347

+0

Thx for your answer!你会把'/ *克隆* /'放到什么位置? – user2051347

+1

使用super.clone创建对象副本的代码,然后用该状态的副本替换所有对可能不可共享的可变状态的引用。这也适用于可传递到达的状态。实现克隆可以快速复杂化。我建议你不要使用clone()。改为使用复制构造函数或复制工厂。 – Pyranja

1

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

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

此外,覆盖在克隆贵公司类。
做这件事最简单的方法就是这个。

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

但是你可能会想出一些自定义的实现。

+0

Thx for your answer!现在我的编译器给我回来:'从Object类型的方法clone()不可见' – user2051347

+1

回答更新。 –

-1

clone()由Object实现并返回一个Object。在您的班级中覆盖克隆()或将您的结果转换为公司。

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

1

你很困惑cloninggenericity

你的情况,你只需要投你的克隆是这样:

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

另外,还要确保你深克隆的对象由overrriding的Object#clone方法(见Object.clone()

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