Je veux créer une Map ainsi et mettre dedans,sachant queCode:maMap.put(1,maClasseFille);
mais ça passe pas :cry:Code:maClasseFille extends Classe mere
Version imprimable
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.
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.
comme dit ci dessus, c'est ton put qui ne va pas. Tu dois passer un Long ou longCitation:
Il peut être implicitement converti en Integer.
Il peut être implicitement converti en long.
Il ne peut pas être implicitement converti en Long.
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.
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++
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 :mouarf:
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, voici le code qui compile pasCode:private HashMap<Class<NomenclatureEntityFullView>,AbstractEntityService<NomenclatureEntityFullView>> maListe = new HashMap<Class<NomenclatureEntityFullView>, AbstractEntityService<NomenclatureEntityFullView>>();
, et voici le message d'erreur d'eclipse :Code:maListe.put(EntityView.class, monService);
Sachant que EntityService extends AbstractEntityService<NomenclatureEntityFullView>, comme je disais par polymorphisme je pensais que le put sur la HashMap marcherait sans aucun souci.Code:
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)
Ah ben avec un exemple c'est déjà mieux !!!
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 :
Pour pallier à cela on utilise les wildcards qui limite l'utilisation (et donc le risque d'erreur) :Code:
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());
Code:Map<Class<? extends NomenclatureEntityFullView>,AbstractEntityService<? extends NomenclatureEntityFullView>> maListe;
a++
En effet ça marche mieux :ccool:, merci beaucoup.