2010-11-23 7 views
3

두 개의 메소드를 오버라이드하려는 수퍼 클래스가 있습니다. 여기에 내 코드입니다 : 내가 어떤 생성자가확장 수퍼 클래스와 ClassCastException

public class MyCustomClass extends SomeSuperClass { 

protected MyCustomClass(params) { 
    super(params); 
} 
@Override 
public void method1() { 
    super.method1(); 
    /* here goes my code */ 
} 
@Override 
public void method2() { 
    super.method2(); 
    /* here goes my another code */ 
} 

, 매개 변수로 SomeSuperClass 객체를 전달하고 난 다음에 무엇을 :

MyCustomClass object; 
/* now i have object of type SomeSuperClass, 
but with my own method1() and method2() */ 
object = (MyCustomClass) MyCustomClass.item(blahblah); 
/* eclipse suggests casting, because MyCustomClass.item() 
constructor still returns SomeSuperClass object */ 
otherobject = OtherConstructor.object(object); 
//OtherConstructor passes SomeSuperClass object 

잘 될 것 같다,하지만 난 자바를 얻고있다. 실행 중 SomeSuperClass에서의 lang.ClassCastException

SomeSuperClassObject를 만들면 재정의 된 메서드가 손실됩니다.

캐스팅을 사용하면 eclipse에서 오류가 발생하지 않아도 응용 프로그램이 충돌합니다. 즉, 어떻게 내 자신의 메서드를 사용하여 SomeSuperClass를 재정의 할 수 있고 OtherConstructor와 함께 사용할 SomeSuperClass 개체를 얻을 수 있습니까? 중요한 경우이 코드는 android app 용입니다.

+3

'MyCustomClass.item'의 코드는 무엇입니까? – Powerlord

+0

그것은 오버라이드되지 않으므로 슈퍼 클래스 메서드 – artemy

+0

을 사용하여 페르시안주의를 사용하기 만하면됩니다. MyCustomClass.item()은 "생성자"가 아니며 또한 "OtherConstructor.object()"도 아닙니다 (실제로 이클립스 코드 도우미에 따르면) ' –

답변

0

item() 메서드가 SomeSuperClass에 선언 된 경우 나는 MyCustomClass의 인스턴스를 반환하는 것으로 의심됩니다. 따라서 캐스트 (MyCustomClass) MyCustomClass.item(blahblah)은 유효하지 않습니다.

+0

왜 안 되니? 컴파일 타임에 두 botch 클래스가있는 경우 부모 클래스의 정적 메서드 item()이 특정 하위 클래스 인스턴스를 반환 할 수 있습니다 (단순한 팩토리 메서드와 같은 일종의). – malejpavouk

+0

네, 그렇습니다. ; 하지만 나는 그것을 의심합니다. 나는 바꿔 말할거야. –

15

일반적으로, 당신은 부모 클래스에 서브 클래스의 인스턴스를 캐스팅 할 수 있습니다

SomeSuperClass object = new SomeSuperClass(params); 
MyCustomClass customClass = (MyCustomClass) object; // throws ClassCastException 

:

MyCustomClass object = new MyCustomClass(params); 
SomeSuperClass superClass = (SomeSuperClass) object; 

그러나 서브 클래스에 슈퍼 클래스의 인스턴스를 캐스팅 할 수 없습니다 MyCustomClass 개체도 SomeSuperClass 개체이기 때문에 모든 개체가 SomeSuperClass이 아닌 경우 MyCustomClass 개체이기 때문입니다.

특정 디자인 패턴으로이 문제를 해결할 수 있습니다. Java 자체는 Decorator pattern을 많이 사용하는 경향이 있습니다.

+0

나는 어느 방향이 괜찮은지 항상 잊고있다. 이것은 도움이됩니다. –

0

MyCustomClass.item (blahblah) 호출이 MyCustomClass보다 다른 (어쩌면 부모) 것으로 반환되는 것으로 보입니다. 테 코드의 유일한 부분은 객체를 주조하는 곳입니다 ...

+0

예, SomeSuperClass 객체 – artemy

+0

을 반환하므로 문제가 발생하여 하위 인스턴스에 부모 인스턴스를 캐스팅 할 수 없습니다. 상속 구조는 IS 언어 구조로 변환 될 수 있습니다. 귀하의 경우 포유류 (수퍼 클래스)와 인간 (하위 클래스) 및 래빗 하위 클래스가 있습니다.당신은 인간 h를 만들 수 있으며 "포유류입니다 (포유류 m = 새로운 인간)"라고 말하면서 포유 동물은 모두 인간이라고 말할 수는 없습니다 (포유류 m = 새로운 위험성, 인간 h = (인간) m) ... 그리고 당신이 한 일이 무엇인지, 그리고 왜 당신이 클래스 캐스팅 예외를 가지고 있는지 ... – malejpavouk

+0

나는 그것을 보았을 때, 당신은 약간 다른 실수를했습니다 ... 당신은 인간 h = 새로운 포유 동물이었습니다. 포유류 (당신의 수퍼 클래스)는 4 개의 다리를 가지고 있고 인간은 2 개의 손과 2 개의 다리를 가지고 있습니다 ... 그래서 부모에 대한 캐스트 참조를 자식에게 넘길 수 없습니다 ... 부모 참조에 자식 객체가 들어있는 경우에만 이것을 할 수 있습니다 (포유류 이 인간은 포유 동물입니다.이 콘크리트 포유류 (모든 포유 동물에게 효과가없는)는 인간입니다. – malejpavouk

0

문제는 해결되었습니다. 시도 :

object = new MyCustomClass(blahblah); 

아직 누군가 설명 할 수 있습니까?

관련 문제