2009-10-16 51 views
0

我讀過Beautiful code with Google Collections, Guava and static imports文章關於Java集合,和下面的代碼片段了我的注意:這個代碼示例是否真的返回正確的參數化類型?

Map<String, Map<Long, List<String>>> map = Maps.newHashMap(); 

的事情是,我不明白它是如何可能的newHashMap方法可以返回一個Map<String,Map<Long, List<String>>>。他們是如何編寫這些代碼的?什麼時候成爲可能?我的印象是,您需要在構造函數調用中顯式聲明泛型參數。

回答

6

您可以在方法調用上聲明泛型參數,而不僅僅是整個類。如果你看一下源爲該方法:

public static <K, V> HashMap<K, V> newHashMap() { 
    return new HashMap<K, V>(); 
} 

你會看到它聲明兩個泛型參數,K和V,並宣佈的結果是一個地圖。編譯器足夠聰明,可以從LHS表達式中找出K和V.在你的情況下,K是String和V是Map<Long, List<String>>

+0

這是「找出」新的東西嗎?還是一直在這裏? – Geo 2009-10-16 17:25:17

+0

+1表示我的英文意思是什麼 – ChssPly76 2009-10-16 17:25:18

+1

@Geo Java 5中的「新」。我不確定你的意思。 – Kevin 2009-10-16 17:26:28

1

看看源代碼。所有這種方法提供了一個很好的捷徑:

public static <K, V> HashMap<K, V> newHashMap() { 
    return new HashMap<K, V>(); 
} 

這將適用於任何參數,因爲HashMap本身是通用的。

+0

是的,它提供了一個捷徑。但爲什麼不是'Map​​map = Maps.newHashMap​​'? – Geo 2009-10-16 17:22:07

+0

@Geo - 我不明白你的意思是你的意見 – ChssPly76 2009-10-16 17:22:53

+0

說這個例子:'ArrayList list = new ArrayList ()'。編寫ArrayList list = new ArrayList()'是否合法?我記得需要明確提到等號兩邊的參數。 – Geo 2009-10-16 17:24:44

相關問題