从前有一个类:

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() 时,这不适用于列表; clone() for HashMap 注释:返回这个 HashMap 实例的浅拷贝:键和值本身没有被克隆,所以你最终手动完成。

  • 序列化也很糟糕,因为它可能需要在任何地方添加 Serializable

    关于java - 用泛型克隆,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/803971/

    10-14 18:36