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 :

Generics. Composition et héritage


Sujet :

Langage Java

  1. #1
    Membre habitué Avatar de le Daoud
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2002
    Messages : 287
    Points : 169
    Points
    169
    Par défaut Generics. Composition et héritage
    Bonjour, j'ai le code suivant qui n'est pas générique

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class A {
       protected B monB;
     
    }
     
    class B {
     protected A monA;
    }
     
    class SousA extends A {
     
      public SousA(SousB b){
        this.monB = b;
      }
     
      public void doIt(){
        ((SousB)monB).dansSousB();
      }
     
      public void dansSousA(){
        // ....
      };
    }
     
    class SousB extends B {
     
      public SousB(SousA a){
        this.monA = a;
      }
     
      public void dansSousB(){
        // ....
      };
    }
    Je souhaiterais rendre le code générique afin d'éviter le cast ((SousB)monB).dansSousB();

    j'ai essayé ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    class A <T extends B>{
       protected T monB;
     
    }
     
    class B <T extends A>{
     protected T monA;
    }
     
    class SousA extends A<SousB> {
     
      public SousA(SousB b){
        this.monB = b;
      }
     
      public void doIt(){
       monB.dansSousB();
      }
     
      public void dansSousA(){
        // ....
      };
    }
     
    class SousB extends B<SousA> {
     
      public SousB(SousA a){
        this.monA = a;
      }
     
      public void dansSousB(){
        // ....
      };
    }
    ça fonctionne mais j'ai deux warning sur les classes parentes :
    class A <T extends B>
    class B <T extends A>
    Le warning est : A is a raw type. References to generic type A<T> should be parameterized et B is a raw type. References to generic type B<T> should be parameterized

    Quelle est la solution pour ne pas tourner en rond (à cause de la bi-directionalité) ? Un SuppressWarning n'est pas conseillé au niveau de la classe...

    Merci !

  2. #2
    Membre expérimenté Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Points : 1 608
    Points
    1 608
    Par défaut
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A <T extends B<? extends A<T>>>{
       protected T monB;
     
    }
     
    class B <T extends A<? extends B<T>>>{
     protected T monA;
    }

  3. #3
    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
    autres solution, plus léger à écrire mais moins fonctionnel je pense:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class A <T extends B<?>>{
       protected T monB;
     
    }
     
    class B <T extends A<?>>{
     protected T monA;
    }

  4. #4
    Membre habitué Avatar de le Daoud
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    287
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2002
    Messages : 287
    Points : 169
    Points
    169
    Par défaut
    Merci à vous deux. Il faut que je révise mes wildcards !


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

Discussions similaires

  1. C# Generic - foreach avec héritage
    Par Pfeffer dans le forum C#
    Réponses: 5
    Dernier message: 11/06/2014, 09h19
  2. Design composite et héritage multiple
    Par Xanto dans le forum Langage
    Réponses: 4
    Dernier message: 29/05/2009, 19h54
  3. composition et héritage: problème d'énoncé?
    Par johnny3 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 04/01/2009, 12h40
  4. Héritage VS Composition
    Par bolhrak dans le forum C++
    Réponses: 8
    Dernier message: 18/12/2006, 04h49
  5. [Java5] Generics et Héritage
    Par denisC dans le forum Langage
    Réponses: 1
    Dernier message: 09/05/2006, 14h54

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