克隆派生类

时间:2014-09-05 06:25:27

标签: java clone

我正在尝试实现派生类的克隆,但是,我没有得到,我不知道为什么。 为什么我不能克隆B类?我得到一个CastClassExpcetion。

public class A implements Cloneable {
    private Integer a;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        A clone = new A(); //Why if I do this instance of super.clone() I get an exception?
        A clone = (A) super.clone();
        clone.a = this.a;
        return clone;
    }
      ..

}

public class B extends A implements Cloneable {
    private String b;
..
    @Override
    protected Object clone() throws CloneNotSupportedException {

        B clone = (B) super.clone();
        clone.b = this.b;
        return clone;
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        B b = new B(1, "s");
        B clone = b.clone();                
    }

}

2 个答案:

答案 0 :(得分:0)

您错误地在a方法中返回bclone()。这导致B.clone()中的异常,因为您无法将整数强制转换为B

要解决此问题,请确保返回clone变量。


另请注意,字段值会自动复制到克隆对象中。没有必要为克隆分配字段值,除非它们是可变的并且您希望防御性地复制它们。在克隆方法中,您有以下冗余行:

clone.a = this.a;

clone.b = this.b;

您可以从B.clone()方法中删除这两行,因为字符串和整数是不可变的。

答案 1 :(得分:0)

你会得到一个ClassCastException,因为A!= B
通过调用 super.clone()(在对象B中),您将获得A的对象。(因为超级 A
但是A的对象不能被投射到B!
(A不是B的孩子,但B是A的孩子)

我还有其他简单的词:
B是/包含更多而不是A(延伸 A!)
所以,你不能施放 A到B,因为 A缺少B部分! (这需要有一个B的对象!)
另一方面,您可以将B转换为A,因为 B包含A

@Override
protected Object clone() throws CloneNotSupportedException {

    B clone = (B) super.clone(); //here is the problem! A is not (cannot be casted to) B.
    clone.b = this.b;
    return clone;
}

你不能把Car送到保时捷(它比汽车更强更多),但你可以将保时捷投入汽车。