2010-01-14 65 views
1

使用谷歌集合之前,我有類似下面的代碼的東西:如何迭代谷歌集合的Multimap <?, Object>?

private Set<A> aSet = ...; 
private Set<B> bSet = ...; 

public Foo getFoo (Map<?, List<Bar>> bars, Set<?> set) { 
    for (Object item : set) { 
     for (Bar bar : bars.get (item)) { 
      //build foo; 
     } 
    } 
    ... 
} 

,我能做出這樣的呼籲:

Map<A, List<Bar> aMap = getAMap(); 
Foo f1 = getFoo (aMap, aSet); 
Map<B, List<Bar> bMap = getBMap(); 
Foo f2 = getFoo (bMap, bSet); 

現在,Multimap之,我不能這樣做:

public Foo getFoo (Multimap<?, List<Bar>> bars, Set<?> set) { 
    for (Object item : set) { 

     // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object 
     for (Bar bar : bars.get (item)) { 
      //build foo; 
     } 
    } 
    ... 
} 

回答

8

試試這個:

public <T> Foo getFoo (Multimap<T, List<Bar>> bars, Set<T> set) { 
    for (T item : aSet) { 

     // compile error: get(capture#621 of ?) in Multimap ... cannot be applied to java.lang.Object 
     for (Bar bar : bars.get (item)) { 
     //build foo; 
     } 
    } 
    ... 
} 

編輯:

如果您看到這兩個類的Javadoc,你會發現,對於地圖的Javadoc:

V get(Object key) 

和多重映射是:

Collection<V> get(K key) 

看得出來, Map的參數沒有生成。

MultiMap更適合泛型,但Map的設計使其與Java 1.4以前的Map具有向後兼容性。

+1

是的,它的工作原理。但我不清楚爲什麼我們需要指定? – Roman 2010-01-14 14:40:39

+0

T確保映射的集合和鍵的元素來自相同的類型 – nanda 2010-01-14 14:42:44

+3

Multimap必須確定鍵的類型是正確的,因爲您獲取的集合是「直寫」到multimap本身中的。 (也就是說,您可以添加一個元素,並且相應的條目出現在multimap中;如果該鍵的類型錯誤,我們會破壞數據)。 Map沒有這樣的擔心,並且在使用Object作爲get()的參數類型時絕對正確。 – 2010-01-15 00:13:43