[Résolu] Problème polymorphisme et sous typage

Problème polymorphisme et sous typage [Résolu] - Java - Programmation

Marsh Posté le 17-05-2007 à 16:02:07    

Bonjour,
 
voici la situation : j'ai une classe A et une classe B implémentant une interface I. Dans une autre classe, j'ai une méthode travaillant sur une ArrayList<I>  (

Code :
  1. void maMethode(ArrayList<I> liste);

). Problème : si je cherche à l'appliquer sur une ArrayList<A> (genre :

Code :
  1. ArrayList<A> listeDeA = new ArrayList<A> ();
  2. maMethode(listeDeA);

), j'ai droit à :
 

Test.java:11: maMethode(java.util.ArrayList<I> ) in Test cannot be applied to (java.util.ArrayList<A> )
                maMethode(listeDeA);
                ^


 
Pourquoi ça ne marche pas, alors que A est un sous-type de I ?


Message édité par fhr le 17-05-2007 à 22:42:30
Reply

Marsh Posté le 17-05-2007 à 16:02:07   

Reply

Marsh Posté le 17-05-2007 à 21:10:19    

ArrayList<I> listeDeA = new ArrayList<A> ();
maMethode(listeDeA);
 
????

Reply

Marsh Posté le 17-05-2007 à 21:42:21    

jbourdellon a écrit :

ArrayList<I> listeDeA = new ArrayList<A> ();
maMethode(listeDeA);
 
????


 

Test.java:10: incompatible types
found   : java.util.ArrayList<A>
required: java.util.ArrayList<I>
                ArrayList<I> listeDeA = new ArrayList<A>();
                                        ^
1 error


Message édité par fhr le 17-05-2007 à 21:43:13
Reply

Marsh Posté le 17-05-2007 à 22:18:10    

1. Utiliser List (une interface) plutôt que ArrayList (une classe concrète)
2. Apprendre à utiliser les generics, dans ce cas précis il faut utiliser les "bounded wildcards"
 
Au final, une signature de méthode correcte serait:

Code :
  1. void maMethode(List<? extends I> liste)


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 17-05-2007 à 22:34:36    

masklinn a écrit :

...dans ce cas précis il faut utiliser les "bounded wildcards"
 
Au final, une signature de méthode correcte serait:

Code :
  1. void maMethode(List<? extends I> liste)



 
Ah merci, je savais qu'on pouvait contraindre la généricité lors de la définition d'une classe, mais je connaissais pas le coup du "?". Merci beaucoup  :jap:  
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed