Zadeklarowanie hash1jako a HashMap<String, ?>dyktuje, że zmienna hash1może przechowywać dowolną, HashMapktóra ma klucz Stringi dowolny typ wartości.
HashMap<String, ?> map;
map = new HashMap<String, Integer>();
map = new HashMap<String, Object>();
map = new HashMap<String, String>();
Wszystkie powyższe są ważne, ponieważ zmienna map może przechowywać dowolną z tych map skrótów. Ta zmienna nie obchodzi, jaki jest typ wartości, jaki zawiera hashmap.
Posiadanie wieloznaczny nie nie , jednak pozwala umieścić każdy rodzaj obiektu na mapie. w rzeczywistości, z powyższą mapą hashującą, nie możesz nic do niej wstawić używając mapzmiennej:
map.put("A", new Integer(0));
map.put("B", new Object());
map.put("C", "Some String");
Wszystkie powyższe wywołania metod spowodują błąd w czasie kompilacji, ponieważ Java nie wie, jaki jest typ wartości HashMap wewnątrz map.
Nadal możesz pobrać wartość z mapy skrótów. Chociaż „nie znasz typu wartości” (ponieważ nie wiesz, jaki typ mapy skrótów znajduje się w zmiennej), możesz powiedzieć, że wszystko jest podklasą, Objecta więc cokolwiek wyjdziesz z mapy będzie typu 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);
Powyższy blok kodu wypisze 10 na konsoli.
Aby zakończyć, użyj HashMapznaku wieloznacznego, gdy nie obchodzi Cię (tj. Nie ma znaczenia), jakie są typy HashMap, na przykład:
public static void printHashMapSize(Map<?, ?> anyMap) {
// This code doesn't care what type of HashMap is inside anyMap.
System.out.println(anyMap.size());
}
W przeciwnym razie określ potrzebne typy:
public void printAThroughZ(Map<Character, ?> anyCharacterMap) {
for (int i = 'A'; i <= 'Z'; i++)
System.out.println(anyCharacterMap.get((char) i));
}
W powyższej metodzie musielibyśmy wiedzieć, że klucz mapy to a Character, w przeciwnym razie nie wiedzielibyśmy, jakiego typu użyć, aby uzyskać z niego wartości. Wszystkie obiekty mają jednak toString()metodę, więc mapa może mieć dowolny typ obiektu dla swoich wartości. Nadal możemy wydrukować wartości.