[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)


---------------
I mean, true, a cancer will probably destroy its host organism. But what about the cells whose mutations allow them to think outside the box, and replicate and expand beyond their wildest dreams by throwing away the limits imposed by overbearing genetic r
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