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

Collection et Stream Java Discussion :

Map et generics, ça ne passe pas


Sujet :

Collection et Stream Java

  1. #1
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut Map et generics, ça ne passe pas
    Je veux créer une Map ainsi
    Citation Envoyé par radtriste Voir le message
    Tu ne peux pas faire un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    HashMap<Long, Classe mere> maMap
    ?
    et mettre dedans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maMap.put(1,maClasseFille);
    ,sachant que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maClasseFille extends Classe mere
    mais ça passe pas

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut Map et generics, ça ne passe pas
    Salut,

    Citation Envoyé par DevServlet Voir le message
    mais ça passe pas
    C'est à dire ?


    a++

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Il me dit qu'il attent un objet de type ClasseMere et non ClasseFille, pourtant ClasseFille hérite de ClasseMere, sur le principe de polymorphisme je pensais que ce serait transparent pour le compilateur.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Citation Envoyé par DevServlet Voir le message
    Il me dit qu'il attent un objet de type ClasseMere et non ClasseFille
    Chez moi, ça ne compile pas, en effet, mais ce n'est pas ça la raison qu'il me donne. Le compilateur me dit qu'il ne trouve pas de méthode de ce nom dont les types des paramètres correspondent à ce qui est donné.
    À aucun moment il ne dit que c'est le paramètre de type ClasseFille le problème. Et pour cause : ça ne l'est pas.

    1 est de type int.
    Il peut être implicitement converti en Integer.
    Il peut être implicitement converti en long.
    Il ne peut pas être implicitement converti en Long.

  5. #5
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par thelvin Voir le message
    1 est de type int.
    Il peut être implicitement converti en Integer.
    Il peut être implicitement converti en long.
    Il ne peut pas être implicitement converti en Long.
    Pas compris ta réponse

  6. #6
    Membre extrêmement actif Avatar de jojodu31
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    875
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2008
    Messages : 875
    Points : 814
    Points
    814
    Par défaut
    Il peut être implicitement converti en Integer.
    Il peut être implicitement converti en long.
    Il ne peut pas être implicitement converti en Long.
    comme dit ci dessus, c'est ton put qui ne va pas. Tu dois passer un Long ou long

  7. #7
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    La valeur 1 que j'avais mise était juste pour une illustration, la clé est bien plus complexe que ça, mais mon souci n'est pas là, mais bien le typage de la valeur plutot.

  8. #8
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Dans ce cas donne un code concret avec le message d'erreur exact !

    Parce qu'avec du pseudo-code et des "ca marche pas" et des "il me dit", tout ce que tu obtiendras au mieux c'est des suppositions et des approximations...


    a++

  9. #9
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    C'est bon c'est contourné, j'ai déclaré une Map non typée , et au moment de la récupértion je passe la clé et je caste le résultat dans le type que je voulais, et ça marche tout seul. désolé de pas vous montrer le code, trop d'élements renvoyants au métier un peu confidentiel du projet

  10. #10
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 567
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 567
    Points : 21 633
    Points
    21 633
    Par défaut
    Ridicule.

    - Aucun contournement n'est nécessaire dans le cas que tu sembles nous décrire, et même si c'est un autre cas, les contournements sont rarement nécessaires.

    - Nous nous fichons de la logique métier. Pour voir ce qui ne va pas avec ton code, on doit savoir comment sont déclarées les deux classes, pour vérifier laquelle hérite de l'autre, et voir comment tu essaies de les mettre dans/récupérer de la Map. Le reste est sans importance.

    Comme tu veux, mais je tiens à signaler pour les générations futures, que tout cela n'est pas un modèle à suivre.

  11. #11
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    Citation Envoyé par thelvin Voir le message
    Ridicule.

    - Aucun contournement n'est nécessaire dans le cas que tu sembles nous décrire, et même si c'est un autre cas, les contournements sont rarement nécessaires.

    - Nous nous fichons de la logique métier. Pour voir ce qui ne va pas avec ton code, on doit savoir comment sont déclarées les deux classes, pour vérifier laquelle hérite de l'autre, et voir comment tu essaies de les mettre dans/récupérer de la Map. Le reste est sans importance.

    Comme tu veux, mais je tiens à signaler pour les générations futures, que tout cela n'est pas un modèle à suivre.
    Comme ce n'est pas non plus un modèle de s'exprimer de cette façon, je n'ai jamais prétendu être un modèle à suivre je le rappelle. Enfin bref désolé si ma réponse a heurté certaines personnes. Voici l'instanciation de ma map
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private HashMap<Class<NomenclatureEntityFullView>,AbstractEntityService<NomenclatureEntityFullView>> maListe = new HashMap<Class<NomenclatureEntityFullView>, AbstractEntityService<NomenclatureEntityFullView>>();
    , voici le code qui compile pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    maListe.put(EntityView.class, monService);
    , et voici le message d'erreur d'eclipse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    The method put(Class<NomenclatureEntityFullView>, AbstractEntityService<NomenclatureEntityFullView>) in the type 
     HashMap<Class<NomenclatureEntityFullView>,AbstractEntityService<NomenclatureEntityFullView>> is not applicable for the arguments (Class<EntityFullView>, EntityService)
    Sachant que EntityService extends AbstractEntityService<NomenclatureEntityFullView>, comme je disais par polymorphisme je pensais que le put sur la HashMap marcherait sans aucun souci.

  12. #12
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Ah ben avec un exemple c'est déjà mieux !!!





    Citation Envoyé par DevServlet Voir le message
    Sachant que EntityService extends AbstractEntityService<NomenclatureEntityFullView>, comme je disais par polymorphisme je pensais que le put sur la HashMap marcherait sans aucun souci.
    Non le polymorphisme ne fonctionne pas de la même manière pour le paramétrage Generics.

    Ceci pour éviter des erreurs de ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Number n = new Integer(); // OK
     
    List<Integer> list = new ArrayList<Integer>(); // OK
     
    List<Number> numbers = list; // ERREUR !!!!
     
    // Sinon on pourrait faire ceci ce qui est faux car en réalité on a une List<Integer> :
    numbers.add(new Double());
    Pour pallier à cela on utilise les wildcards qui limite l'utilisation (et donc le risque d'erreur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<Class<? extends NomenclatureEntityFullView>,AbstractEntityService<? extends NomenclatureEntityFullView>> maListe;



    a++

  13. #13
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 938
    Points : 3 938
    Points
    3 938
    Par défaut
    En effet ça marche mieux , merci beaucoup.

Discussions similaires

  1. [RegEx] mon motif de regex ne passe pas
    Par hansaplast dans le forum Langage
    Réponses: 31
    Dernier message: 19/10/2005, 12h20
  2. ADO et access, ça passe pas.
    Par maximdus dans le forum Bases de données
    Réponses: 4
    Dernier message: 19/09/2005, 23h38
  3. Requête qui ne passe pas
    Par TheBart dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/08/2005, 11h12
  4. Envoi de mail [Hotmail : OK ; Wanadoo : Passe pas]
    Par NeoMan dans le forum Réseau
    Réponses: 14
    Dernier message: 28/07/2005, 11h52
  5. Sujet du mailto quine passe pas...
    Par Gourouni dans le forum ASP
    Réponses: 6
    Dernier message: 21/01/2005, 16h57

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