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 :

Héritage et List


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 127
    Par défaut Héritage et List
    Bonjour à tous,

    Je fais face au problème suivant:

    Soit une classe B héritant d'une classe A.

    L'exemple suivant "compile":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void test(){
         B b = new B();
         tester(b);
    }
     
    tester(A a){ }
    Par contre, l'exemple suivant ne compile pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void test(){
         List<B> listeb  = new ArrayList<B>();
         tester(listeb );
    }
     
    void tester(List<A> listeA){ }
    Logique puisque B hérite de A mais ArrayList<B> n'hérite pas pour autant d'ArrayList<A>

    Du coup mon approche à été la suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void test(){
         List<B> listeb = new ArrayList<B>();
         tester(listeb );
    }
     
    void <G extends A>tester(List<G> listeG){ }
    La tout marche, la méthode tester est spécifiée comme prennant en paramètre une liste d'instance de la classe G, héritant de A. Cependant, quid des perfs, une approche aussi générique peut-elle avoir une incidance sur les performance (il s'agit de code très appellé et donc très critique en terme de performances).

    Qui plus est je rajoute même une couche d'héritage, mon pattern de code étant similaire à:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class Matching<T>{
    ...
     
    void <G extends T>tester(List<G> listeG, List<Matching<T>> listeMatching)
     
    }
    Cordialement,
    Benoît.

  2. #2
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Les générics n'ont aucune incidence sur les performances pour la simple et bonne raison que le code généré par le compilateur sera le même derrière à savoir une list d'objet.
    Les générics ne sont pas des templates, ils servent uniquement à la compilation mais sont perdus à l'exécution.
    Ainsi le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List<A> list = new ArrayList<A>();
    A a = new A();
    list.add(a);
    est exactement le même que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    List list = new ArrayList();
    A a = new A();
    list.add(a);
    à la seule différence que si on essaye de compiler en ajoutant un objet de type B, ça ne compilera pas dans le premier cas. Mais à l'execution c'est la même chose et ce aussi complexe que soit le généric .
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  3. #3
    Membre émérite
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Par défaut
    Bonjour,

    je ne suis pas sur à 100%, mais j'aurais envie de dire que la généricité n'impacte pas les perf dans la mesure où elle disparaît à l'exécution.

    Pour info, dans le cas où tu ne fais que consulter les éléments de ta liste et de les traiter en tant que A, tu peux très bien t'en sortir sans typer ta méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void tester(List<? extends A> listeA){ }
    Cette notation possède des limites mais permet une écriture plus souple.
    Elle est, à mon sens, plus adaptée quand tu ne souhaites que traiter des A sans plus d'infos.

  4. #4
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Par défaut
    Tu trouveras plus de détails sur les Generics dans cet article
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster ;) (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag :resolu:

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

Discussions similaires

  1. Problème d'héritage de List
    Par Will Fou dans le forum C#
    Réponses: 5
    Dernier message: 22/01/2013, 17h59
  2. Héritage et liste
    Par Flaburgan dans le forum C#
    Réponses: 12
    Dernier message: 06/04/2011, 13h22
  3. Héritage et liste variable d'arguments
    Par jimaitou dans le forum Débuter
    Réponses: 9
    Dernier message: 08/03/2009, 19h52
  4. empecher héritage dans liste à puce imbriquées
    Par zamanika dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 15/03/2007, 15h18
  5. Héritage et listes chainées...
    Par syntaxerror dans le forum C++
    Réponses: 7
    Dernier message: 04/05/2005, 20h18

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