我正在尝试实现派生类的克隆,但是,我没有得到,我不知道为什么。 为什么我不能克隆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();
}
}
答案 0 :(得分:0)
您错误地在a
方法中返回b
和clone()
。这导致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送到保时捷(它比汽车更强更多),但你可以将保时捷投入汽车。