从前有一个类:
public class Scope<C extends Cloneable & Comparable<C>> implements Comparable<Scope<C>>, Cloneable, Serializable {
private C starts;
private C ends;
...
@SuppressWarnings("unchecked")
@Override
public Object clone() {
Scope<C> scope;
try {
scope = (Scope<C>) super.clone();
scope.setStarts((C) starts.clone()); // The method clone() from the type Object is not visible
scope.setEnds((C) ends.clone()); // The method clone() from the type Object is not visible
} catch (CloneNotSupportedException e) {
throw new RuntimeException("Clone not supported");
}
return scope;
}
}
在对象中我们有:
protected native Object clone() throws CloneNotSupportedException;
Cloneable接口(interface)是:
public interface Cloneable {
}
我应该如何克隆它?
最佳答案
解决方案
使用 Java Deep-Cloning图书馆。
克隆库 是一个小型的开源(apache 许可证)java 库,可深度克隆对象。这些对象不必实现 Cloneable 接口(interface)。实际上,这个库可以克隆任何 java 对象。如果您不想修改缓存的对象,或者您想要创建对象的深拷贝,它可以在缓存实现中使用。
Cloner cloner=new Cloner();
XX clone = cloner.deepClone(someObjectOfTypeXX);
附录
以前的答案有以下缺点:
- 它增加了很多代码
- 它要求您列出要复制的所有字段并执行此操作
- 这在使用
clone()
时不适用于列表;HashMap
的clone()
注意:返回此HashMap
实例的浅拷贝:键和值本身未被克隆,所以您最终需要手动完成。
序列化也很糟糕,因为它可能需要在任何地方添加 Serializable
。
关于java - 用泛型克隆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/803971/