Декларація 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
може зберігати будь-яку з цих хеш-карт. Цю змінну не хвилює, який тип значення має хешмап, який він містить.
Однак, маючи підстановку, це не дозволяє вводити будь-який тип об’єкта на вашу карту. насправді, маючи хеш-карту вище, ви нічого не можете помістити в неї за допомогою map
змінної:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Усі вищезазначені виклики методу призведуть до помилки часу компіляції, оскільки Java не знає, що таке значення типу HashMap всередині map
.
Ви все ще можете отримати значення з хеш-карти. Хоча ви "не знаєте типу значення" (оскільки ви не знаєте, який тип хеш-карти знаходиться всередині вашої змінної), ви можете сказати, що все є підкласом 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));
}
У вищевказаному методі нам потрібно було б знати, що ключ Map - це Character
, інакше ми не знаємо, який тип використовувати для отримання значень з нього. toString()
Однак всі об'єкти мають метод, тому карта може мати будь-який тип об'єкта за його значеннями. Ми ще можемо надрукувати значення.