Объявление hash1
как HashMap<String, ?>
диктует, что переменная hash1
может содержать любой, HashMap
который имеет ключ String
и любой тип значения.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Все вышеперечисленное является действительным, потому что переменная map
может хранить любую из этих хэш-карт. Эта переменная не заботится о том, что представляет собой тип Value, из хеш-карты, которую он содержит.
Имея подстановочные вовсе не , однако, позволяют поместить любой тип объекта в вашу карту. на самом деле, с хэш-картой выше, вы не можете поместить в нее что-либо, используя map
переменную:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Все приведенные выше вызовы методов приведут к ошибке во время компиляции, поскольку Java не знает, что такое тип Value внутри HashMap map
.
Вы все еще можете получить значение из хэш-карты. Хотя вы «не знаете тип значения» (потому что вы не знаете, какой тип хеш-карты находится внутри вашей переменной), вы можете сказать, что все является подклассом Object
и, таким образом, все, что вы получаете из карты. будет иметь тип 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);
Приведенный выше блок кода выведет 10 на консоль.
Итак, чтобы закончить, используйте HashMap
с подстановочными знаками, когда вам все равно (то есть, это не имеет значения), какие типы HashMap
, например:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
В противном случае укажите типы, которые вам нужны:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
В приведенном выше методе нам нужно знать, что ключ карты является a Character
, иначе мы не знали бы, какой тип использовать для получения значений из него. Однако все объекты имеют toString()
метод, поэтому карта может иметь любой тип объекта для своих значений. Мы все еще можем напечатать значения.