2010-02-23 2 views
0

다중 중첩 일반 클래스는 서로 어떻게 참조 할 수 있습니까?

public abstract class ClassA<ClassBType extends ClassB<ClassCType>,ClassCType extends ClassC> { 
    public void method(ClassBType type) { 
     type.myClassA = this; //Error. Type mismatch: cannot convert from TestGameMain.ClassA<ClassBType,ClassCType> to TestGameMain.ClassA<TestGameMain.ClassB<ClassCType>,ClassCType> 
    } 
} 

public abstract class ClassB<ClassCType extends ClassC> { 
    ClassA<ClassB<ClassCType>,ClassCType> myClassA; 

    private void testMethod() { 
     myClassA.method(this); 
    } 
} 

public abstract class ClassC {} 
} 

이 문제를 해결하는 올바른 방법은 무엇입니까 아래의 코드를 검사?

편집 : 위 코드는 컴파일되지 않았으므로 컴파일했습니다. 를 ClassA의 인스턴스를 얻는 것은 사람을 가지고 있다면 당신이이 동물을 인스턴스화하는 방법에 대한 자세한 내용을 알고 있어야합니다

ClassA<ClassB<ClassCType>, ClassCType> myClassA; 

알고 :

+0

, 제네릭의 이러한 사용은 유지 보수가 복잡하다는 단점이 있습니다. 보다 간단한 접근법을 찾아야합니다. –

+0

이것은 유용한 것보다 더 많은 생각의 실험입니다. 이 문제가 발생하여 Eclipse에서 문제를 해결할 방법을 찾지 못했습니다. 실제로 더 이상 사용하지 않습니다. –

답변

1

당신도 ClassC없이 동일한 문제를 설명 할 수있는 ClassA<ClassB>ClassA<ClassBType> 사이에 상속 관계가 없다 (도가 있어야한다), 할당을 할 수 없습니다. 이 예제의 비밀 성격을 감안할 때, 나는이 문제에 대한 "해결책은"실제로 있는지 확실하지 않습니다 만, 다음 코드는 컴파일 않습니다 당신이 할 수있는 방법을 찾을 수 있는지 여부

public abstract class ClassA<ClassBType extends ClassB> { 
    public void method(ClassB type) { 
     type.myClassA = this; 
    } 
} 

public abstract class ClassB { 
    ClassA<? extends ClassB> myClassA; 

    private void testMethod() { 
     myClassA.method(this); 
    } 
} 
+0

단순화 문제는 그것이 문제를 숨기고 있다는 것이다. ClassB 자체가 매개 변수화 된 경우 extends를 사용하여 참조하는 것이 문제가 될 수 있습니다. 'ClassA >는 구문이지만 모든 경우에 사용할 수는 없습니다. 그럼 당신은'>>' – Yishai

+0

@ Yishai - 예, 당신이 맞습니다. 원래의 경우는 훨씬 더 복잡했고, 따라서 진정한 해결책은 내가 제안한 것보다 더 복잡 할 것입니다. 그러나 단순화 된 문제에 대한 해결책을 살펴봄으로써 OP는 그것을 전체 문제로 확장 할 수 있기를 희망했습니다. 이 문제의 핵심은 '클래스 C'의 존재에 의존하지 않았다. – kvb

5

정말 귀하의 질문에 뭔가를 누락하지 않는 한,이 작업을 수행 매개 변수는 해결이 필요한 문제입니다. 문제는 분산에 내려 오는

public abstract class ClassA<ClassBType extends ClassB> { 
    public void method(ClassBType type) { 
     type.myClassA = this; 
    } 
} 

public abstract class ClassB { 
    ClassA<ClassB> myClassA; 

    private void testMethod() { 
     myClassA.method(this); 
    } 
} 

을 : - 귀하의 예는 지나치게 복잡

+0

문제가 제기 한 원래의 문제가 해결되었습니다. 하지만 제 문제는 실제로 더 구체적이었고 위의 코드와 관련이있었습니다. 나는 당신의 코드를 추가했고, 나는 또한 실제로보고있는 이슈를 일으키는 효과를 추가했다. –

관련 문제