Declarar hash1
como un HashMap<String, ?>
dictamen que la variable hash1
puede contener cualquiera HashMap
que tenga una clave String
y cualquier tipo de valor.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Todo lo anterior es válido, porque la variable map
puede almacenar cualquiera de esos mapas hash. A esa variable no le importa cuál es el tipo de Valor, del hashmap que contiene.
Sin embargo, tener un comodín no le permite poner ningún tipo de objeto en su mapa. De hecho, con el mapa de hash anterior, no se puede agregar nada usando la map
variable:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Todas las llamadas a métodos anteriores generarán un error en tiempo de compilación porque Java no sabe cuál es el tipo de valor de HashMap en su interior map
.
Todavía puede obtener un valor del mapa hash. Aunque "no conoce el tipo de valor" (porque no sabe qué tipo de mapa hash está dentro de su variable), puede decir que todo es una subclase de Object
y, por lo tanto, lo que sea que salga del mapa será del tipo Objeto:
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);
El bloque de código anterior imprimirá 10 en la consola.
Por lo tanto, para terminar, utilice un HashMap
con comodines cuando no le importe (es decir, no importa) cuáles son los tipos de HashMap
, por ejemplo:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
De lo contrario, especifique los tipos que necesita:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
En el método anterior, necesitaríamos saber que la clave del Mapa es a Character
, de lo contrario, no sabríamos qué tipo usar para obtener valores de ella. toString()
Sin embargo, todos los objetos tienen un método, por lo que el mapa puede tener cualquier tipo de objeto para sus valores. Todavía podemos imprimir los valores.