Recastage et héritage avec une List

Recastage et héritage avec une List - Java - Programmation

Marsh Posté le 20-05-2008 à 11:02:34    

Bonjour à tous,
 

Code :
  1. Tutu extends Toto


 

Code :
  1. public List<Tutu> getTutuList()
  2. {
  3.          return super.getTotoList(); // méthode de la classe mère qui renvoie List<Toto>
  4. }


ne marche pas, normal, mais
 

Code :
  1. public List<Tutu> getTutuList()
  2. {
  3.          return (List<Tutu> ) super.getTotoList();  // méthode de la classe mère qui renvoie List<Toto>
  4. }


 
ne marche pas non plus, alors comment faire ce recastage proprement ?
 
j'ai essayé

Code :
  1. public List<? extends Toto> getTutuList()

mais ensuite quand on fait

Code :
  1. Tutu tutu = getTutuList().get(index);

on est obligé de caster en faisant

Code :
  1. Tutu tutu = (Tutu) getTutuList().get(index);

Or je souhaite éviter ça en recastant "à la source" c'est à dire dans la méthode getTutuList()


Message édité par cimourdain le 23-05-2008 à 17:08:19
Reply

Marsh Posté le 20-05-2008 à 11:02:34   

Reply

Marsh Posté le 20-05-2008 à 11:20:47    

java.util.Collections.copy

Reply

Marsh Posté le 20-05-2008 à 12:56:05    

juste un peu plus précisément, tu peux me donner la ligne de code stp ? C'est

Code :
  1. List<Tutu> liste = new ArrayListe<Tutu>();
  2. java.util.Collections.copy(liste, super.getTotoList());
  3. return liste;


qu'il faut que j'écrive, c'est ça ?
 
Je trouve ça pas terrible parce qu'on ne prends pas en compte que Tutu hérite de Toto avec cette méthode.


Message édité par cimourdain le 20-05-2008 à 12:58:13
Reply

Marsh Posté le 21-05-2008 à 16:08:28    

up

Reply

Marsh Posté le 22-05-2008 à 17:33:32    

ok ça semble marcher mais j'aurais préféré jouer avec les types paramétrés qu'avec cette astuce douteuse...

Reply

Marsh Posté le 22-05-2008 à 17:43:11    

Comment ça douteuse ?
 
javadoc

Reply

Marsh Posté le 23-05-2008 à 09:35:59    

ben les

Code :
  1. <? extends Toto>

et les

Code :
  1. <? super Titi>

c'est fait pour ça normalement, mais j'ai pas réussit à m'en sortir avec...


Message édité par cimourdain le 23-05-2008 à 09:36:34
Reply

Marsh Posté le 23-05-2008 à 16:18:45    

En fait ça marche pas du tout.
 
Je reprends:
 

Code :
  1. Tutu extends Toto


 
et:
 

Code :
  1. Y extends X


 
dans la classe Toto j'ai un champs:
 

Code :
  1. protected List<X> listeX;


 
et son getter:
 

Code :
  1. public List<X> getListX()
  2. {
  3.    return listX;
  4. }


 
maintenant les choses se compliquent, dans la classe Tutu, j'ai:
 

Code :
  1. public List<Y> getListX() // Il faut que ça soit le même nom que la méthode correspondante dans la classe parente
  2. {       
  3.    return super.getListX(); // à cet endroit j'ai essayé le java.util.Collections.copy() mais ça marche pas
  4. }


 
et ça ne marche pas, il veut pas compiler.
 
J'ai essayé:
 

Code :
  1. public List<Y> getListX()
  2. {
  3.      List<Y> result = new ArrayList<Y>();
  4.      java.util.Collections.copy(super.getListX(), result);
  5.      return result;
  6. }


 
mais ça ne marche pas.
 
J'ai aussi essayé avec des

Code :
  1. <? extends X>

et

Code :
  1. <? super Y>

un peu partout, mais rien à faire.
 
 
Je perds énormément de temps avec ce problème, si quelqu'un pouvait m'expliquer ce qui ne va pas je lui en serais très reconnaissant.
 
Merci.
 
 
 
EDIT:
 
La meilleure solution que j'ai trouvée est la suivante:
 

Code :
  1. // Dans la classe Toto:
  2. protected List<? extends X> listeX;
  3. // et le getter:
  4. public List<? extends X> getListeX()
  5. {
  6.    return listeX;
  7. }
  8. // Dans la classe Tutu:
  9. public List<Y> getListeX()
  10. {
  11.     List<Y> result = new ArrayList<Y>();
  12.     List<? extends X> listeParente = super.getListeX();
  13.     for (int i = 0; i < listeParente.size(); i++)
  14.           result.add((Y) listeParente.get(i))
  15.     return result;
  16. }


 
Voilà ça a l'air de marcher, sauf que je me suis rendu compte d'un autre problème dans la méthode qui permet d'ajouter un élément dans la listeX de la classe mère Toto:
 

Code :
  1. public void addX(X x)
  2. {
  3.      listeX.add(x); // erreur: the method add(List<? extends X> ) in the type List<? extends X> is not applicable for the argument (X)
  4. }


Message édité par cimourdain le 23-05-2008 à 16:41:25
Reply

Marsh Posté le 24-05-2008 à 16:10:31    

Peut-être que tu peux trouver ton bonheur la-dedans:
http://www.angelikalanger.com/Gene [...] csFAQ.html
Pour l'instant, je vois pas. :/

 

Au passage, le compilo d'eclipse considère que ces 2 méthodes sont identiques:

Code :
  1. public List<T> getListe(){
  2.  return super.getListe();
  3. }
  4. public List<? extends T> getListe(){
  5.  return super.getListe();
  6. }


Ceci à cause du "type erasure"  (le compilo Java transforme ces 2 signatures en List getList()).


Message édité par el muchacho le 24-05-2008 à 18:31:42

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 24-05-2008 à 17:05:29    

En fait, tout bien réfléchi, je ne comprends pas l'utilité de ta méthode  public List<Y> getListeX().

 

Déjà, le nom est trompeur, ce qui est mauvais signe. Ensuite, quitte à faire un cast, je pense qu'il est plus propre d'en laisser la responsabilité à l'appelant plutôt que de créer une liste supplémentaire et faire une grosse recopie sous le capot pour la retourner à l'appelant, là où on s'attendrait à ce qu'un getListe soit un simple retour d'un pointeur.


Message édité par el muchacho le 24-05-2008 à 17:10:14

---------------
Les aéroports où il fait bon attendre, voila un topic qu'il est bien
Reply

Marsh Posté le 24-05-2008 à 17:05:29   

Reply

Marsh Posté le 26-05-2008 à 15:08:42    

ben un Tutu contient une listeX puisque c'est avant tout un Toto, donc c'est normal qu'il ait sa méthode getListeX() mais il faut la redéfinir car comme c'est un Tutu c'est des X plus "particuliers" (des Y) que la liste contient.

Reply

Marsh Posté le 26-05-2008 à 15:47:32    

"ça marche pas" n'aide pas bcp comme description de problème...
 

cimourdain a écrit :

ben un Tutu contient une listeX puisque c'est avant tout un Toto, donc c'est normal qu'il ait sa méthode getListeX() mais il faut la redéfinir car comme c'est un Tutu c'est des X plus "particuliers" (des Y) que la liste contient.


 
Par hasard, sais-tu que la relation List<Y> extends List<Y> ne sera en principe pas vérifiée si Y extends X ?


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Marsh Posté le 26-05-2008 à 17:37:16    

sircam a écrit :

"ça marche pas" n'aide pas bcp comme description de problème...
 


 

sircam a écrit :


 
Par hasard, sais-tu que la relation List<Y> extends List<Y> ne sera en principe pas vérifiée si Y extends X ?


 
ça veut rien dire ce que tu dis.

Reply

Marsh Posté le 26-05-2008 à 17:53:52    

M'enfin?
 
http://forum.hardware.fr/hfr/Progr [...] m#t1655359
 

Citation :

Un moyen efficace d'exposer votre problème est le classique duo comportement attendu / comportement observé. Plus informatif que "ça ne marche pas" ou "j'ai une erreur".
(...)
Messages d'erreur du compilateur ou d'exécution sont vos amis.


 
 
Pour ma remarque concernant l'héritage, si tu comprends pas, beh... essaye encore? [:spamafote]


---------------
Now Playing: {SYNTAX ERROR AT LINE 1210}
Reply

Sujets relatifs:

Leave a Replay

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