Déclarer en hash1
tant que HashMap<String, ?>
dicte que la variable hash1
peut contenir tout ce HashMap
qui a une clé de String
et tout type de valeur.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Tout ce qui précède est valide, car la variable map
peut stocker n'importe laquelle de ces cartes de hachage. Cette variable ne se soucie pas du type de valeur, du hashmap qu'il contient.
Cependant, le fait d'avoir un caractère générique ne vous permet pas de placer n'importe quel type d'objet dans votre carte. en fait, avec la carte de hachage ci-dessus, vous ne pouvez rien y mettre en utilisant la map
variable:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Tous les appels de méthode ci-dessus entraîneront une erreur de compilation car Java ne sait pas quel est le type de valeur du HashMap à l'intérieur map
.
Vous pouvez toujours obtenir une valeur de la carte de hachage. Bien que vous «ne connaissiez pas le type de la valeur» (parce que vous ne savez pas quel type de carte de hachage se trouve dans votre variable), vous pouvez dire que tout est une sous-classe de Object
et, par conséquent, tout ce que vous obtenez de la carte sera du type Object:
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);
Le bloc de code ci-dessus imprimera 10 sur la console.
Donc, pour finir, utilisez un HashMap
avec des jokers lorsque vous ne vous souciez pas (c'est-à-dire que peu importe) quels sont les types de HashMap
, par exemple:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
Sinon, spécifiez les types dont vous avez besoin:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
Dans la méthode ci-dessus, nous aurions besoin de savoir que la clé de la carte est a Character
, sinon nous ne saurions pas quel type utiliser pour en obtenir des valeurs. toString()
Cependant, tous les objets ont une méthode, de sorte que la carte peut avoir n'importe quel type d'objet pour ses valeurs. Nous pouvons toujours imprimer les valeurs.