2012-08-07 48 views
1

拿到鑰匙,我有以下代碼:無法從番石榴Multimap之

@Override 
public boolean putAll(Multimap<? extends Index, ? extends V> multimap) { 
    for (Index index : multimap.keySet()) { 
     putAll(index, multimap.get(index)); 
    } 
} 

multimap.get(index)是一個編譯錯誤:

The method get(capture#5-of ? extends Index) in the type Multimap is not applicable for the arguments (Index)

有我偶然發現了一個著名的仿製藥的疑難雜症?我不安靜的看看問題是什麼。

附註:我建立,因爲我有特定的密鑰匹配要求

回答

2

假設你放在一個Multimap<FooIndex, Integer>擴展SetMultiMap類。那麼你已經有了:

Multimap<FooIndex, Integer> map = ...; 
Index plainIndex = ...; 
Integer value = map.get(plainIndex); 

這是一個類型的故障,因爲Multimap.get需要Key。我懷疑你需要這個方法一般:

@Override 
public <Key extends Index> boolean putAll(Multimap<Key, ? extends V> multimap) { 
    for (Key index : multimap.keySet()) { 
     putAll(index, multimap.get(index)); 
    } 
} 

(我沒有測試它,但更有意義,IMO)

+0

太好了,非常感謝!在方法返回類型之前,我從來沒有使用過泛型,只是學到了一些新的東西:)在這種情況下,這與'public boolean putAll(Multimap multimap)'是一樣的,對吧?無論哪種方式,問題的理解,謝謝!唯一的問題是,這個'putAll'方法不再覆蓋'SetMultimap '中的'putAll'。我需要使用原始的界面,我會改變實現以使其適合。 – Miquel 2012-08-07 13:26:58

2

get方法的簽名是

get(K key) 

你Multimap之聲明爲

Multimap<? extends Index, ? extends V> multimap 

所以,你不知道密鑰的類型。你知道它是或者它擴展了Index,但你不知道它的類型。所以傳遞一個Index的實例是無效的。

+0

我明白了,你是對的,那是行不通的:/ – Miquel 2012-08-07 13:19:54

1

您是否嘗試過使用常規的MultimapEquivalence.wrap-您的鑰匙?