2010-09-03 8 views
4

Pourquoi ne pas que le travail en Java, mais cela neCarte <Chaîne, Carte <Chaîne, Booléen >> myMap = new HashMap <Chaîne, HashMap <Chaîne, Booléen >>();

Map<String, Map<String, Boolean>> myMap = new HashMap<String,Map<String,Boolean>>(); 

Juste pour clarifier l'altération ci-dessous de la HashMap imbriquée montre une erreur de compilation, alors que ci-dessus ne pas; avec une carte (non hashmap)

Map<String, Map<String, Boolean>> myMap = new HashMap<String,HashMap<String,Boolean>>(); 

Répondre

9

Ceci est parce que les médicaments génériques en Java sont invariant, à savoir, même si la classe B est un A, un Collection<B> est pas un Collection<A>.

Et c'est pour une bonne raison. Si votre exemple était légal, cela serait possible:

Map<String, HashMap<String, Boolean>> myHashMap = new HashMap<String,HashMap<String,Boolean>>(); 
Map<String, Map<String, Boolean>> myMap = myHashMap; 
myMap.put("oops", new TreeMap<String, Boolean>()); 
HashMap<String, Boolean> aHashMap = myMap.get("oops"); // oops - ClassCastException! 
+0

Mais, compte tenu de la déclaration de myMap, qu'est-ce que cela m'importe de voir quel type de cartes sont mises en place tant qu'elles implémentent l'interface Map? – extraneon

+0

@extraneon: Dans ce cas, voir la réponse de Boris. – Powerlord

+0

@extraneon, voir mon exemple mis à jour. –

-1

Je pense que ce à cause de la différence entre Map<String, Boolean> et HashMap<String,Boolean>. En effet, les génériques sont ici une spécification, qui doit être la même des deux côtés. (ou du moins c'est mon opinion).

5

Dans le deuxième cas myMap est une carte dont les clés sont de type String et les valeurs sont de type Map<String, Boolean>. HashMap<String, Boolean> n'est pas un Map<String, Boolean> il l'implémente. Par conséquent, il compilera:

Map<String, ? extends Map<String, Boolean>> myOtherMap = 
    new HashMap<String,HashMap<String,Boolean>>(); 
+1

Un HashMap est une Map . –

+0

Ricky a raison, l'utilisation de "est un" est regrettable (depuis HashMap isa Map). Essentiellement en utilisant '? extends' détend l'exigence de type Generic de la correspondance exacte à la correspondance de la hiérarchie d'héritage. – idbrii

Questions connexes