Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
6590 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Recastage et héritage avec une List

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Recastage et héritage avec une List

n°1734299
cimourdain
Posté le 20-05-2008 à 11:02:34  profilanswer
 

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
mood
Publicité
Posté le 20-05-2008 à 11:02:34  profilanswer
 

n°1734329
Taz
bisounours-codeur
Posté le 20-05-2008 à 11:20:47  profilanswer
 

java.util.Collections.copy

n°1734420
cimourdain
Posté le 20-05-2008 à 12:56:05  profilanswer
 

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
n°1735291
cimourdain
Posté le 21-05-2008 à 16:08:28  profilanswer
 

up

n°1735814
cimourdain
Posté le 22-05-2008 à 17:33:32  profilanswer
 

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

n°1735820
Taz
bisounours-codeur
Posté le 22-05-2008 à 17:43:11  profilanswer
 

Comment ça douteuse ?
 
javadoc

n°1736005
cimourdain
Posté le 23-05-2008 à 09:35:59  profilanswer
 

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
n°1736353
cimourdain
Posté le 23-05-2008 à 16:18:45  profilanswer
 

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
n°1736640
el muchach​o
Comfortably Numb
Posté le 24-05-2008 à 16:10:31  profilanswer
 

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
n°1736650
el muchach​o
Comfortably Numb
Posté le 24-05-2008 à 17:05:29  profilanswer
 

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
mood
Publicité
Posté le 24-05-2008 à 17:05:29  profilanswer
 

n°1737243
cimourdain
Posté le 26-05-2008 à 15:08:42  profilanswer
 

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.

n°1737278
sircam
I Like Trains
Posté le 26-05-2008 à 15:47:32  profilanswer
 

"ç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}
n°1737342
cimourdain
Posté le 26-05-2008 à 17:37:16  profilanswer
 

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.

n°1737353
sircam
I Like Trains
Posté le 26-05-2008 à 17:53:52  profilanswer
 

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}

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Recastage et héritage avec une List

 

Sujets relatifs
Utilisation de Setcurrent entre les canvas et ListHeritage: virtual / static probleme de design
question sur l'héritage multiplehéritage multiple .. pour ou contre ?
[Javascript] héritage entre classe dans des fichiers différentsquestion héritage CSS
Affichage d'un objet d'une std::listSérialiser/Désérialiser simplement des Maps et List avec Axis? utopie?
petite question sur l'héritage et les castquestion de débutant, casts & héritage
Plus de sujets relatifs à : Recastage et héritage avec une List


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)