2008-11-04 6 views
6

Zwykle wpisuję deklaracje map, ale robiłem konserwację i znajdowałem jeden bez wpisywania. To dało mi do myślenia (o nie!). Jakie jest domyślne wpisanie deklaracji mapy. Rozważ następujące:Domyślne typy HashMap dla K i V

Map map = new HashMap(); 
map.put("one", "1st"); 
map.put("two", new Integer(2)); 
map.put("three", "3rd"); 
for (Map.Entry entry : map.entrySet()){ 
    System.out.println(entry.getKey() + " -> " + entry.getValue()); 
} 

ten błąd z niekompatybilnymi typami na Map.Entry. Więc jeśli wpiszę deklarację z:

Map<Object,Object> map = new HashMap(); 

wtedy wszystko działa dobrze. Jaki jest domyślny typ, który zostanie ustawiony w deklaracji? Czy może brakuje mi czegoś innego?

Odpowiedz

4

Typ to java.lang.Object.

do konstrukcji odbywa typu iterowalny i wywołuje jego iteracyjnej metodą. Ponieważ Zestaw nie został wpisany za pomocą generycznych, iterator zwraca obiekty typu Obiekt. Te muszą być wyraźnie rzutowane na typ Map.Entry.

Map map = new HashMap(); 
map.put("one", "1st"); 
map.put("two", new Integer(2)); 
map.put("three", "3rd"); 
for (Object o : map.entrySet()) { 
    Map.Entry entry = (Map.Entry) o; 
    System.out.println(entry.getKey() + " -> " + entry.getValue()); 
} 
8

Nie ma domyślnego typu.

Typy generyczne Java są tylko do sprawdzania podczas kompilacji. Są usuwane w czasie wykonywania i zasadniczo znikają.

Pomyśl o generykach jako statycznym pomocniku dla a) lepszego udokumentowania kodu oraz b) umożliwienia ograniczonej kontroli czasu kompilacji dla bezpieczeństwa typu.

1

HashMap to zbiór obiektów, Think C++ pojemników. Każdy element mapy jest "pojemnikiem" do przechowywania danych.
Umieszczasz różne rodzaje danych w zasobnikach, a hashmap musi wiedzieć, że nie są one tym samym typem danych. Jeśli w mapie mieszającej zostałby umieszczony tylko jeden typ danych, pojawi się ostrzeżenie, ale zostanie ono skompilowane.