2014-09-05 1 views
1

파생 클래스의 복제를 구현하려고하는데, 그 이유는 모르겠습니다. 클래스 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

관련 항목 : http://stackoverflow.com/questions/4081858/about-java-cloneable – mariusm

+0

귀하의 코드 (귀하의 복제 구현 및 주요 방법)를 보면, 귀하는 귀하가 무엇인지 알지 못한다고 생각합니다. 하기. 무엇을 성취하고 싶습니까? 왜''System.out.println ("A");'? – Ben

+0

글쎄, 그것은 단지 코드가 끝났다는 것을 아는 것입니다. – Guille

답변

0

당신은 실수로 clone() 방법에 ab을 반환한다. B으로 정수를 캐스팅 할 수 없기 때문에 B.clone()에 예외가 발생합니다.

수정하려면 대신 clone 변수를 반환하십시오.


또한 필드 값이 자동으로 복제 개체에 복사됩니다. 변경 가능하고 방어 적으로 복사하려는 경우가 아니면 복제본에 필드 값을 지정할 필요가 없습니다. 문자열과 정수는 불변이기 때문에,

clone.a = this.a; 

clone.b = this.b; 

당신은 당신의 B.clone() 방법에서 두 줄을 제거 할 수 있습니다 : 당신의 복제 방법에서 이러한 중복 라인을 가지고있다.

+0

내가 할 때 클론 = (A) super.clone(); 안 할 복제본 = 새로운 A(); 그런 다음 CastClassException이 발생합니까? super.clone()을 수행하면 동일한 참조로 작업하지 않으니까? 그것은 복제품이 아닙니다. 또는 코드를 디버깅 할 때처럼 보입니다. – Guille

0

! = super.clone에()를 (객체 B의)를 호출하여 B
, 당신은 A의 객체를 얻을 수 있기 때문에 당신은 ClassCastException를 얻을 것이다 (슈퍼때문에)
그러나 A의 객체는 B에 캐스팅 될 수 없습니다!
는 (A는 B의 아이가 아니라 B가의 자식)

나는 다른 더 간단 단어 :
B는 당신이/그래서 (A)보다 (! 그것을 를 확장)
이 포함되어 있습니다 수 없다 캐스트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; 
} 

당신은 (그냥 차보다 입니다) 포르쉐에 자동차를 캐스팅 할 수는 없지만 포르쉐 자동차에에게 캐스트 할 수 있습니다.