我有公司对象列表。我试图克隆这个列表:
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()
进行深层复制?
答案 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)
您感到困惑cloning
和genericity
。
在您的情况下,您只需要将克隆转换为:
clone.add((Company)item.clone());
另外,请确保通过覆盖Object#clone
方法深度克隆对象(请参阅Object.clone():
否则,此方法创建此对象的类的新实例,并使用该对象的相应字段的内容初始化其所有字段,就像通过赋值一样;这些字段的内容本身不会被克隆。因此,该方法执行该对象的“浅拷贝”,而不是“深拷贝”操作。
答案 3 :(得分:-1)
clone()由Object实现并返回一个Object。覆盖类中的clone()或将结果转换为Company。
clone.add((Company) item.clone());