2009-07-17 87 views
2

這似乎是一個愚蠢的問題,但我現在絆倒它。爲什麼編譯?爲什麼這個代碼與泛型編譯?

import java.util.*; 

public class Test { 
     public static void main (String[] argv) throws Exception { 
       Map<String,String> map = new HashMap<String,String>(); 
       map.get(new ArrayList<String>()); 
     } 
} 

用不與「String」兼容的東西調用get是不是非法?

+0

運行FindBugs,它會抱怨get()中使用的不良對象類型。 – akarnokd 2009-07-17 19:09:54

+0

作爲提問者,我投票結束爲一個愚蠢的:http://stackoverflow.com/questions/857420/what-are-the-reasons-why-map-getobject-key-is-not-fully-通用 – jsight 2009-07-17 19:14:00

+0

+從我身邊關閉。 – akarnokd 2009-07-17 19:36:20

回答

3

從的Javadoc Map

V get(Object key) 

返回如果 此映射包含沒有映射到其中 指定鍵所映射的值,或空密鑰 。

get只是一個接受ANY對象的方法,並且將(如果存在)返回映射到它的對象。所以傳遞一個非字符串是合法的,但是,因爲所有的鍵都必須是字符串,所以如果你傳遞一個非字符串,你總是會得到空值。

1

方法Map只需要一個Object,而不是通用類型K

該代碼將編譯,但永遠不會從地圖中獲得任何東西。

1

Map.get需要一個Object,而不是一個通用類型,比較。 documentation

get(Object key):返回指定鍵映射到的值;如果此映射不包含鍵映射,則返回null。

重要的是它返回一個泛型類型,所以你不必轉換返回值。