在子类中实现clone()



我有两个类:父类A和一些子类B,它扩展了A,并且比A多了几个字段。我希望能够克隆这两个类,所以我从Object类重写了clone()方法。

由于类B基本上是带有一些额外字段的类A,我想在类B的clone()实现中使用类A的克隆

    public class A
    {
      public Object clone()
      {
        A cloneA = new A();
        cloneA.foo = this.foo;
        cloneA.bar = this.bar;
        return cloneA;
      }
    }
    public class B extends B
    {
      public Object clone()
      {
        Object cloneA = super.clone();
        B cloneB = (B)cloneA;
        cloneB.fieldSpecificForB = this.fieldSpecificForB;
        return cloneB;
      }
    }

这样,我就不必在B的clone()方法中复制来自A的clone()方法的所有克隆逻辑。不幸的是,这不起作用,因为Java不允许将类A的对象强制转换为类B的对象。我四处寻找如何做到这一点的答案,但似乎没有办法重用来自A的克隆逻辑。这是否意味着每次我向A添加另一个字段时,我都必须手动将该字段的复制添加到所有子类的clone()方法中。这似乎很容易出错。。。

clone的工作方式是,它自动为您复制所有字段。但是,您必须调用super.clone()才能使其工作:

public class A implements Cloneable  // add 'implements'
{
  public Object clone()
  {
    A cloneA = super.clone(); // this copies all fields and returns something of *the same type* as 'this'...
    return cloneA;
  }
}
public class B extends A //supposed to extend 'A' right?
{
  public Object clone()
  {
    Object cloneA = super.clone(); // this returns object of runtime type B
    B cloneB = (B)cloneA; // will work
    return cloneB;
  }
}

编辑:实际上你的clone方法现在什么都不做,所以它相当于写:

public class A implements Cloneable  //add 'implements'
{
}
public class B extends A //supposed to extend 'A' right?
{
}

implements Cloneable部分就是其中的一部分。另请参见可克隆。

问题在于A#clone()的实现。您永远不应该使用new创建将在clone方法中返回的实例,而应该始终通过调用super.clone()来创建,这正是为了避免您现在遇到的错误。

所以将你的A级调整为

public class A
{
  @Override
  protected Object clone() throws CloneNotSupportedException
  {
    A cloneA = (A)super.clone();
    cloneA.foo = this.foo;
    cloneA.bar = this.bar;
    return cloneA;
  }
}

最新更新