Das Deklarieren hash1
als HashMap<String, ?>
diktiert, dass die Variable hash1
jeden enthalten kann HashMap
, der einen Schlüssel String
und einen beliebigen Werttyp hat.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Alle oben genannten Punkte sind gültig, da die Variable map
jede dieser Hash-Maps speichern kann. Dieser Variablen ist es egal, um welchen Werttyp es sich bei der darin enthaltenen Hashmap handelt.
Hat eine Wildcard Having nicht aber lassen Sie jede Art von Objekt in Ihre Karte setzen. Tatsächlich können Sie mit der obigen Hash-Map mit der map
Variablen nichts einfügen:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Alle oben genannten Methodenaufrufe führen zu einem Fehler bei der Kompilierung, da Java den Wertetyp der darin enthaltenen HashMap nicht kennt map
.
Sie können immer noch einen Wert aus der Hash-Map abrufen. Obwohl Sie "den Typ des Werts nicht kennen" (weil Sie nicht wissen, welcher Typ von Hash-Map in Ihrer Variablen enthalten ist), können Sie sagen, dass alles eine Unterklasse von Object
und, was auch immer Sie aus der Map herausholen, ist wird vom Typ Objekt sein:
HashMap<String, Integer> myMap = new HashMap<>();// This variable is used to put things into the map.
myMap.put("ABC", 10);
HashMap<String, ?> map = myMap;
Object output = map.get("ABC");// Valid code; Object is the superclass of everything, (including whatever is stored our hash map).
System.out.println(output);
Der obige Codeblock gibt 10 auf der Konsole aus.
Verwenden HashMap
Sie zum Abschluss ein mit Platzhaltern, wenn Sie sich nicht darum kümmern (dh es spielt keine Rolle), um welche Typen HashMap
es sich handelt, zum Beispiel:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
Andernfalls geben Sie die Typen an, die Sie benötigen:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
Bei der obigen Methode müssten wir wissen, dass der Schlüssel der Karte ein ist Character
, andernfalls würden wir nicht wissen, welchen Typ wir verwenden sollen, um Werte daraus zu erhalten. Alle Objekte haben jedoch eine toString()
Methode, sodass die Karte für ihre Werte einen beliebigen Objekttyp haben kann. Wir können die Werte immer noch drucken.