2010-02-23 5 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 {} 
} 

Что такое правильный способ, чтобы исправить эту проблему?

Редактировать: Я обновил код выше, который не компилируется.

+0

ли или вы не можете найти способ сделать это, могу ли я предположить, что это использование дженериков waaayyy сложно для обслуживания. Вам нужно найти более простой подход. –

+0

Это скорее мысленный эксперимент, чем что-то полезное. Я столкнулся с этой проблемой, и Eclipse не смог найти способ ее исправить. Я больше не использую его. –

ответ

1

Ваш пример слишком сложно - вы можете продемонстрировать тот же вопрос, даже без ClassC:

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); 
    } 
} 

Проблема сводится к дисперсии: нет отношения наследования между 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 сам параметризуется, ссылаясь на то, что использование расширений может стать проблематичным. 'ClassA > 'является синтаксисом, но он не может использоваться во всех случаях. Затем вы попадаете в '>> ' – Yishai

+0

@Yishai - Да, вы правы, что исходный случай был еще более сложным, и что истинное решение также будет более сложным, чем то, что я предложил. Однако я надеялся, что, рассмотрев решение упрощенной проблемы, ОП сможет распространить его на полную проблему. Суть проблемы не зависела от существования ClassC. – kvb

5

Если я не уверен, действительно не хватает что-то в вашем вопросе, это делает работу:

ClassA<ClassB<ClassCType>, ClassCType> myClassA; 

Я бы знать больше о том, как создать экземпляр этих животных, чтобы знать, если получение экземпляра ClassA иметь те параметры - это проблема, требующая решения.

+0

Это исправляет исходную проблему, заданную вопросом. Но моя проблема была на самом деле более конкретной и включала код выше. Я добавил ваш код, и я также добавил что-то, что вызывает проблему, которую я действительно вижу. –