Объявление 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 не знает, что такое тип значения 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));
}
В приведенном выше методе нам нужно знать, что ключ карты - это Character
, в противном случае мы бы не знали, какой тип использовать для получения значений из него. Однако все объекты имеют метод toString()
, поэтому карта может иметь любой тип объекта для своих значений. Мы все еще можем напечатать значения.