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 :

déclarer "List maListe=new LinkedList()" ne peut utiliser méthodes propres à LinkedList


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 58
    Par défaut déclarer "List maListe=new LinkedList()" ne peut utiliser méthodes propres à LinkedList
    bonjour,

    J'utilise actuellement le FAQ sur les collections:

    http://java.developpez.com/faq/java/...angage_donnees

    Je ne saisi pas à 100% la notion de polymorphisme qui me permet de déclarer List maListe=new LinkedList() et non LinkedListmaListe=new LinkedList(). J'aimerai donc votre point de vue sur mon pb ainsi que mon interprétation.

    Le problème est que dans le code ci-dessous, si je fais cela, je ne peut accéder aux méthodes propres de LinkedList: getFirst et getLast.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    List maListe=new LinkedList() ; // on crée notre liste chaînée
    		maListe.add(new Integer(1)) ; // on ajoute l'entier 1 à la liste
    		maListe.add(new Float(2.15)) ; // on ajoute le flottant 2.15 à la liste
    		/* On remarque ici que l'entier 1 est la tête de la liste, et que le flottant
    		 * est la queue de la liste. */
     
    		System.out.println("first: "+maListe.getFirst()+" Last: "+maListe.getLast());
    Donc j'aimerai comprendre si le comportement est normal. Pour accéder au méthodes de LinkedList je dois écrire: LinkedList maListe=new LinkedList().

    Le polymorphisme nous permet de faire List maListe=new LinkedList() car LinkedListest est une List. Mais le type effectif de maListe devrait tout de même être LinkedList non?Donc on devrait accéder à ces méthodes propres?

    Merci pour vos futures réponses.

    Cordialement

    Cyril

  2. #2
    Membre expérimenté

    Inscrit en
    Octobre 2009
    Messages
    133
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 133
    Par défaut
    Pour utiliser les méthodes spécifiques a LinkedList, il faut effectivement faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkedList maListe=new LinkedList();

    L'appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List maListe=new LinkedList()
    marche car LinkedList est une implémentation de l'interface List.
    Néanmoins, lorsque tu écris cette ligne, tu associe l'objet maListe a un objet List (et non LinkList), par conséquent tu ne peux accéder qu'aux méthodes de List.


    Si tu souhaites utiliser les méthodes specifiques de LinkedList lorsque tu l'as déclaré en List, il te faut faire un casting explicite au moment de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((LinkedList)maListe).getFirst()
    Ceci marchera dans ton exemple car maListe est bien une implémentation de LinkedList (mais tu lèveras une exception si ton objet maListe est une instance d'une autre classe)

  3. #3
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par henolivier Voir le message
    Si tu souhaites utiliser les méthodes specifiques de LinkedList lorsque tu l'as déclaré en List, il te faut faire un casting explicite au moment de l'appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ((LinkedList)maListe).getFirst()
    Ceci marchera dans ton exemple car maListe est bien une implémentation de LinkedList (mais tu lèveras une exception si ton objet maListe est une instance d'une autre classe)
    Justement non dans ce cas il ne faut pas faire cela. Il est préférable de déclarer en tant que LinkedList !


    Le fait d'utiliser List permet de faire abstraction du type exact de la liste, et donc de faire un code plus générique qui s'adaptera à toutes sortes de listes.

    Or ici tu as besoin d'un traitement ultra-spécifique qui ne fonctionnera qu'avec une LinkedList, donc tu dois la déclarer comme tel. A moins que tu ne puisses utiliser une autre abstraction plus en adéquation avec tes besoins (comme Deque par exemple).


    a++

  4. #4
    Membre averti
    Inscrit en
    Avril 2006
    Messages
    58
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 58
    Par défaut
    Ok merci pour vos réponses.

    Il faut donc bien déclarer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LinkedList maListe=new LinkedList();
    Pour utiliser les méthodes spécifiques de LinkedList.

    J'ai donc peur que le tutoriel:

    http://fmora.developpez.com/tutoriel.../introduction/

    Soit faux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    List maListe=new LinkedList() ; // on crée notre liste chaînée
    maListe.add(new Integer(1)) ; // on ajoute l'entier 1 à la liste
    maListe.add(new Float(2.15)) ; // on ajoute le flottant 2.15 à la liste
    /* On remarque ici que l'entier 1 est la tête de la liste, et que le flottant
     * est la queue de la liste. */
    Integer monEntier=(Integer)maListe.getFirst() ; // on n'oublie pas de faire le cast
    Float monFloat=(Float)maListe.getLast(); // on n'oublie pas de faire le cast
    maListe.remove(0) ; // on retire l'entier , le flottant devient la tete
    On ne peut pas utiliser la méthode de LinkedList getFirst et getLast en délcarant List maListe=new LinkedList()
    Je ne suis pas certain de comment signaler cette erreur.

    L'exercice 7.2. Les Listes Chaînées semble lui aussi erroné, ou du moins l'énoncé est peut clair.

    Merci encore pour votre aide.

    PS: Le tutoriel de Clément cunin :

    http://java.developpez.com/faq/java/...angage_donnees

    donne une bonne réponse dans la partie Comment bien utiliser les collections ?

    Conseil :
    Tout d'abord, afin de minimiser la quantité de code à modifier pour changer d'implémentation, il convient de toujours faire référence aux collections en utilisant les interfaces, seule l'étape de construction faisant référence à l'implémentation.



    // La bonne solution :
    List list = new ArrayList();
    Set set = new HashSet();
    Map map = new TreeMap();
    // La mauvaise solution :
    ArrayList list = new ArrayList();
    HashSet set = new HashSet();
    TreeMap map = new TreeMap();

    Il peut néanmoins arriver qu'on soit contraint d'utiliser la 2ème solution pour avoir accès aux méthodes spécifiques à l'implémentation. En effet les classes concrètes sont souvent plus riches que les interfaces, ce qui peut se révéler nécessaire pour tirer le meilleur parti possible d'une implémentation.

  5. #5
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par cfrelet Voir le message
    J'ai donc peur que le tutoriel:

    http://fmora.developpez.com/tutoriel.../introduction/

    Soit faux.
    Je dirais plutôt un mauvais copier/coller...

    Citation Envoyé par cfrelet Voir le message
    Je ne suis pas certain de comment signaler cette erreur.
    Tu peux contacter l'auteur par MP : http://www.developpez.net/forums/u47431/mavina/

    a++

  6. #6
    Membre éprouvé
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Par défaut
    Salut,

    En effet, j'ai fait une erreur sur ce code, on ne peut bien évidemment pas utiliser le code spécifique à une LinkedList en la déclarant List.

    Je vais corriger dès que j'en aurai le temps, parceque là j'ai pas super le temps, je vais essayer demain !

    Merci en tous cas de me le faire remarquer, je suis ouvert à toute critique, surtout si j'ai tord

    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     LinkedList malist=new LinkedList()
    est ok si tu as vraiment besoin d'utiliser les fonctions spécifiques aux linkedlist, sinon tu dois utiliser la déclaration en List.

    F.

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

Discussions similaires

  1. QGIS : lenteur pour afficher les listes des vues dans "Ajouter une table PostGIS"
    Par fafa63 dans le forum SIG : Système d'information Géographique
    Réponses: 2
    Dernier message: 11/07/2014, 19h04
  2. Simple Quotes liste déroulante
    Par totot dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 12/02/2014, 11h22
  3. [Package listings] Commentaires XML et quote
    Par arnobidul dans le forum Mise en forme
    Réponses: 0
    Dernier message: 27/07/2007, 11h54
  4. [débutant] erreur "indice de liste hors limites(1)"
    Par lidouka dans le forum Langage
    Réponses: 2
    Dernier message: 13/12/2005, 14h31

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