2011-11-07 7 views
2

에 캐스트 할 수 없습니다.아동 클래스는 일반적인 부모 클래스

Foo<Qux> foo = new Foo<Qux>(); 
foo.setA(new C()); 

마지막 줄이 형 푸에 오류 "세타를 제공합니다

class Foo<T> extends Bar<T> { 
    setA(A<T> a){ ...} 
} 

이 지금은이 모든를 사용하려면 : 지금은 같은 매개 변수를 사용하여 다른 클래스 (또한 일반)가 인수 C "에 대한 응용 프로그램이 아닙니다.

무엇이 잘못되었는지 알 수 없습니다. 내 생각에는 C가 사용되는 매개 변수 유형 인 A를 확장하는 B를 확장하기 때문에 작동해야합니다. 내 가정과 관련하여 잘못된 힌트를 주셔서 감사합니다.

업데이트 : 올리 (Oli)가 게시 한 코드를 사용하여 오류의 원인에보다 가까워졌습니다. B를 원래 클래스로 바꾼 후에 발생합니다. 따라서 "generic"부분을 제거한 클래스에 위치해야합니다. 부모 클래스에 캐스트하려고 시도 할 때 Eclipse는 말할 수 없습니다. 내가 거기에 계속 찾고거야, 나는 그것이 작동해야합니다 알고 ... 문제는이 감소 할 수 있습니다

이이 오류가 발생 내 코드에서
C c = new C(); 
A<Qux> a = (A<Qux>)c; 

Cannot cast from C to A<Qux> 

나는 여전히이 이것이 일어나는 이유. 하위 클래스를 상위 클래스로 캐스팅 할 수없는 이유가 있습니까? 그런 이유가 없습니다. 그런 문제가 생기면 그것은 단지 IDE 일 수 있습니다. 나는 다른 이유로 Eclipse를 다시 시작하고 다시 확인했다.

+0

언급 한 오류가 표시되지 않습니다 (위의 선언 된'foo' 인스턴스에서'setA'가 호출 된 것으로 가정합니다). –

+0

전화에 대한 힌트는 – Yashima

+0

나는 아직도 찾고있다 ... 내 수업으로 그의 코드를 작성하여 무슨 일이 일어나는지 알아 낸다. – Yashima

답변

3

다음은 나를 위해 잘 컴파일 :

public class Test { 

    static class Qux {}; 

    static class A<T> {} 
    static class B extends A<Qux> {} 
    static class C extends B {} 

    static class Bar<T> {} 
    static class Foo<T> extends Bar<T> { 
     void setA(A<T> a) {} 
    } 


    public static void main(String[] args) { 
     Foo<Qux> foo = new Foo<Qux>(); 
     foo.setA(new C()); 

     // From question update 
     C c = new C(); 
     A<Qux> a = c; 
    } 
} 

귀하의 문제는 다른 곳에서 거짓말을해야합니다.

+0

어쨌든 코드에 대한 감사의 말로, 실제 클래스에 대해이 테스트를 설정하려고합니다. 아마도 실수를했을 수도 있습니다. 질문을 쓰는 중. – Yashima

+0

테스트 해보니 도움을 주셔서 감사합니다. 이클립스를 다시 컴파일 한 후에 나온다. (원래의 문제가 전혀 존재하지 않았기 때문에이 질문을 지금 보존 할 가치가 있는지 확신 할 수 없다. – Yashima