IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Problème List<ClasseMere> et List<ClasseFille>


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut Problème List<ClasseMere> et List<ClasseFille>
    Bonjour,

    Je me pose une petite question, concernant l'héritage et les List.

    J'ai une classe OffrePrix qui hérite de la classe Affaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class OffrePrix extends Affaire
    Dans mon contrôleur j'ai une propriété List<Affaire> affaires.
    Mais lorsque je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.affaires = this.offrePrixBean.getOffresASuivre() //qui renvoie une List<OffrePrix>
    J'ai une erreur d'incompatibilité de type (type attendu : List<Affaire> type reçu: List<OffrePrix>), donc incompilable.

    N'est-il pas possible de faire ceci? ou bien dois-je définir la propriété affaires en List uniquement?

    Merci de vos conseils.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En effet, imaginons qu'une List<OffrePrix> soit aussi une List<Affaire>. Je pourrais donc faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<OffrePrix> list = getOffresASuivre();
    List<Affaire> listAff = list;
    listAff.add(new Affaire());
    for (OffrePrix offre : list){
      // qui coincera sur le Affaire qui n'est pas une OffrePrix
    }
    Par contre, si j'utilise le marqueur ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    List<OffrePrix> list = getOffresASuivre();
    List<? extends Affaire> listAff = list;
    listAff.add(new Affaire()); // sera interdit par le compilateur, ce qui est normal
    for (OffrePrix offre : list){
      // qui ne coincera car on aura pas altéré la liste
    }
    donc dans ton cas, changer la déclaration dans ton code. Eventuellement changer aussi le type renvoyé par ton getter, mais pas indispensable.

    edit... Tu as aussi la possibilité si ça t'arrange de faire une nouvelle liste dissociée, ce qui t'évite de changer tes types:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.affaires = new ArrayList<Affaire>(getOffresPrix());

  3. #3
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    tchize
    Comme d'habitude tu as de très bons conseils.
    j'ai opté pour la solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List<? extends Affaire>
    Je dois modifier tous les types de mes getters, mais j'ai a pas 50
    le wildcard est une chose que j'utilise très peu. Je n'ai pas encore ce réflexe.

    pour tchize

  4. #4
    Membre habitué Avatar de touftouf57
    Profil pro
    Développeur .NET
    Inscrit en
    Décembre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2007
    Messages : 362
    Points : 174
    Points
    174
    Par défaut
    Je suis en train de regarder mes anciens posts, et avec le peu d'expérience que j'ai acquis, maintenant j'arrive à mettre un nom à ces problèmes.

    Ici, j'avais un problème de covariance - contravariance (je ne sais qui est qui, mais bon ce n'est pas dramatique).

    Je trouve que la définition java est mieux pensée que C# à ce niveau puisque l'utilisation du wildcard défini parfaitement le contenu de la collection.
    Ici nous attendons une liste de "quelquechose" qui hérite de la classe Affaire.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 23/08/2006, 10h05
  2. Problème avec les champ obligatoire et liste déroulante
    Par snakejl dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/05/2006, 18h21
  3. Réponses: 28
    Dernier message: 24/05/2006, 18h20
  4. Réponses: 1
    Dernier message: 19/01/2006, 17h54
  5. Problème d'affichage dynamique d'une liste
    Par bor1s dans le forum ASP
    Réponses: 2
    Dernier message: 18/11/2005, 16h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo