2010-06-10 8 views
2

J'ai donc 3 classes.Question sur les génériques Java

Abstract class A 

Class B extends class A 

independent Class C 

Dans la classe D qui contient la principale méthode, je crée une liste des instances de la classe B

List<B> b = methodCall(); // the method returns a list of instances of class B 

Maintenant en classe CI ont une méthode qui est commune à la fois A et B, et donc je ne veux pas le dupliquer. Je veux avoir une méthode qui prend en entrée une instance de la classe A, comme suit:

public void someMethod(List<A> a) 

Cependant, quand je fais:

C c = new C(); 
c.someMethod(b); 

je reçois une erreur que certains méthode n'est pas applicable pour l'argument List<B>, il s'attend plutôt à obtenir List<A>.

Y at-il un bon moyen de résoudre ce problème? Merci beaucoup!

+0

Ce n'est pas une question d'héritage, il est une question de génériques. Consultez le didacticiel sur les génériques. C'est une bonne référence pour ce genre de question: http://java.sun.com/j2se/1.5/pdf/generics-tutorial.pdf –

+0

Pouvez-vous inclure les définitions de fonctions réelles et une copie de l'erreur que vous obtenez? – VeeArr

Répondre

8

Si vous avez une méthode qui attend List<A>, et une classe B extends A, et que vous souhaitez transmettre cette méthode un List<B>, vous devez déclarer la méthode comme:

public void someMethod(List<? extends A> list) 

Cela permet à la liste passé à la méthode pour être une liste de A ou tout ce qui étend B.

Notez bien que vous ne serez pas en mesure de dire le type exact de ? passé dans la méthode. De plus, si vous avez des méthodes dupliquées entre deux classes, c'est probablement un signe que quelque chose ne fonctionne pas avec votre conception.

+0

Merci beaucoup! cela a résolu mon problème. Je ne savais pas à propos de cette option. – user247866

+0

Alors allez-y et acceptez la réponse. –

3
public void someMethod(List<? extends A> a){ //... 
+0

Eh bien, la question ne cesse d'être modifiée alors maintenant je ne sais pas si l'affiche essayait d'utiliser des génériques ou non. –

+0

Modifier les méthodes de conflit. –

1

Dans votre signature de méthode, vous avez List<A> a, ce qui signifie qu'elle accepte uniquement une liste d'objets de type A. Ce dont vous avez besoin est quelque chose qui accepte une liste de A et any subtype of A (ou une famille de sous-types de A).

Qu'est-ce que vous avez besoin est ceci:

public void someMethod(List<? extends A> list) { 
    ... 
}