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 :

Pb de generics avec Map< A, List<B>>


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut Pb de generics avec Map< A, List<B>>
    Bonjour,

    J'ai une inertace IA:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface IA {
    	public Map<? extends IB, List<? extends IC>> getTruc();
    }
    J'ai deux classes BImpl et CImpl qui implémentent respectivement les interfaces IB et IC.

    Dans l'implémentation AImpl de IA je pensais pouvoir surdéfinir ma méthode de cette façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	public Map<BImpl, List<CImpl>> getTruc() {
    		// TODO Auto-generated method stub
    		return null;
    	}
    Mais ça ne compile pas du tout et j'avoue ne pas comprendre pourquoi Bref toute explication serait la bienvenue....

  2. #2
    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,


    Cela ne compile pas car ce n'est pas compatible...

    a++

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut
    Merci de ta réponse mais je ne te cache pas que ton message ne m'aide pas beaucoup à comprendre ce qui cloche...

    Si je défini dans mon interface IA une fonction retournant une Map<? extends IB, ? extends IC> je n'ai aucun soucis pour la surdéfinir dans AImpl pour qu'elle retourne Map<BImpl, CImpl> . Par exemple le code suivant compile très bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public interface IA {
    	public Map<? extends IB, ? extends IC> getMachin();
    }
    public class AImpl implements IA {
    	public Map<BImpl, CImpl> getMachin(){
    		return null;
    	}
    }
    Je ne comprends pas pourquoi quand je met une List dans cette Map plus rien n'est "compatible"...

    Il doit pourtant être possible de faire ce genre de multimap avec les generics non ?

  4. #4
    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
    Car le double niveau d'abstraction peut poser problème dans certains cas.


    Prenons cet exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, ? extends Object> map = new HashMap<String, String>();
    Ces deux types sont parfaitement compatible (dans ce sens) et permettent de faire abstraction sur le type concret de la valeur de la Map.

    Mais ce code est également typesafe : puisqu'on ne connait pas le type exact du second paramètrage on ne peut pas modifier la map : tout appel à put() ou autre méthode de ce type génèrera une erreur de compilation puisque le typage est inconnu...


    Maintenant lorsque tu utilises ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, List<? extends Object>> map
    Le typage de la List est inconnu, mais celui de la map est connu et tu peux donc faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map.put("test", new List<Integer>());
    Or si le compilateur t'autorisait à faire quelque chose du genre de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Map<String, List<? extends Object>> map = new HashMap<String, List<String>>(); // ERREUR
    cela reviendrait à mettre une List<Integer> dans une map de List<String>, ce qui engendrerait des erreurs bien casse-tête lors de l'exécution...




    Selon ce que tu veux faire, il faudrait mieux manipuler des types précis en "généricifiant" tes classes/interfaces :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    interface IA<TB extends IB, TC extends IC> {
    	public Map<TB, List<TC>> getMachin();
    }
     
    class AImpl implements IA<BImpl, CImpl> {
    	public Map<BImpl, List<CImpl>> getMachin(){
    		return null;
    	}
    }

    a++

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 20
    Par défaut
    Grand merci pour cette explication, et cette solution !

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

Discussions similaires

  1. Critère de requête avec une zone de liste dans un formulaire
    Par Dehez dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 19/06/2006, 12h49
  2. [VBA-E]Erreur avec une combobox qui liste le contenu de cell
    Par Tartenpion dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/03/2006, 12h01
  3. Réponses: 1
    Dernier message: 19/01/2006, 17h54
  4. [PERL] Problème avec map
    Par LE NEINDRE dans le forum Langage
    Réponses: 9
    Dernier message: 05/10/2005, 09h48
  5. [generic] pb création d'une List []
    Par yoplaboom dans le forum Langage
    Réponses: 6
    Dernier message: 08/07/2005, 13h01

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