2010-02-23 8 views
0

Examiner le code suivantComment les classes génériques multi-imbriquées peuvent-elles se référer les unes aux autres?

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 {} 
} 

Quelle est la bonne façon de résoudre ce problème?

Modifier: J'ai mis à jour le code ci-dessus, qui ne compile pas.

+0

Si oui ou non vous pouvez trouver un moyen de le faire, Puis-je suggérer que cette utilisation de génériques est waaayyy compliquée pour être maintenable. Vous devez trouver une approche plus simple. –

+0

C'est plus une expérience de pensée que quelque chose d'utile. J'ai rencontré ce problème et Eclipse n'a pas trouvé le moyen de le réparer. Je ne l'utilise plus vraiment. –

Répondre

1

Votre exemple est trop compliqué - vous pouvez démontrer le même problème, même sans 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); 
    } 
} 

Le problème se résume à la variance: il n'y a pas de relation d'héritage entre un ClassA<ClassB> et un ClassA<ClassBType> (ne devrait pas y être), l'affectation ne peut donc pas être effectuée. Étant donné la nature cryptique de cet exemple, je ne sais pas si cela est en fait une « solution » à votre problème, mais le code suivant ne compile:

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

Le problème avec la simplification est qu'il cache un problème. Si ClassB est lui-même paramétré, référencer qu'utiliser extends peut devenir problématique. 'ClassA > 'est la syntaxe, mais elle n'est pas utilisable dans tous les cas. Ensuite, vous entrez dans >> ' – Yishai

+0

@Yishai - Oui, vous avez raison que le cas d'origine était encore plus compliqué, et qu'une vraie solution sera donc aussi plus compliquée que ce que j'ai suggéré. Cependant, j'espérais qu'en examinant la solution au problème simplifié, le PO pourrait l'étendre à l'ensemble du problème. Le point crucial du problème ne dépendait pas de l'existence de 'ClassC'. – kvb

5

À moins que je suis vraiment manque quelque chose dans votre question, ce fait le travail:

ClassA<ClassB<ClassCType>, ClassCType> myClassA; 

Je dois en savoir plus sur la façon dont vous instancier ces animaux pour savoir si obtenir une instance de ClassA d'avoir les paramètres est un problème qui nécessite une résolution.

+0

Cela résout le problème original posé par la question. Mais mon problème était en fait plus spécifique, et impliqué le code ci-dessus. J'ai ajouté votre code, et j'ai également ajouté quelque chose à l'effet qui cause le problème que je vois vraiment –

Questions connexes