2008-11-04 131 views
6

我通常鍵入我的地圖聲明,但是正在做一些維護操作,發現其中一個沒有鍵入。這讓我想到了(哦,不!)。 Map聲明的默認輸入是什麼。考慮以下幾點:K和V的HashMap默認類型

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()); 
} 

這個錯誤與Map.Entry中的不兼容類型有關。所以如果我輸入聲明:

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

然後一切正常。那麼聲明中設置的默認類型是什麼?還是我錯過了別的?

回答

4

該類型爲java.lang.Object

構建體需要類型的可迭代並調用其迭代方法。由於集合未用泛型類型化,迭代器返回類型爲的對象對象。這些需要明確地轉換成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

沒有默認類型。

Java泛型中的類型僅用於編譯時檢查。它們在運行時被擦除,基本上消失了。

將泛型看作靜態助手,以便a)更好地記錄代碼,並b)爲類型安全啓用一些有限的編譯時檢查。

1

HashMap是Think C++容器的集合。地圖的每個元素都是一個「桶」來存放數據。
您正在把不同類型的數據放入桶中,hashmap需要知道這些數據類型不是全部相同。如果只有一種類型的數據被放置在散列表中,你會得到一個警告,但它會編譯。