2014-03-25 45 views
5

Apache Commons Collections庫的4.0版本添加了泛型支持。我無法轉換我的代碼以利用它:使用自定義值集合類型創建Commons Collections MultiValueMap

我想要一個MultiValueMap它將一個字符串作爲關鍵字,並將字符串集合作爲值。但是:

  1. 的關鍵應保留插入排序
  2. 值應 唯一針對每一個琴鍵並保留插入排序(所以我用裝飾LinkedHashMap創建 多值圖)(所以我想要的 值集合類型爲LinkedHashSet)。

我能得到的最接近的是:

MultiValueMap<String, String> orderedMap = MultiValueMap.multiValueMap(
    new LinkedHashMap<String, Collection<String>>(), 
    LinkedHashSet.class 
); 

但是,產生錯誤:

The method multiValueMap(Map<K,? super C>, Class<C>) in the type MultiValueMap is not applicable for the arguments (LinkedHashMap<String,Collection<String>>, Class<LinkedHashSet>)

所以,現在我在泛型地獄。任何建議將是最受歡迎的。

此前4.0版本的,我做到了這一點與以下:

MultiValueMap orderedMap = MultiValueMap.decorate(
    new LinkedHashMap<>(), 
    LinkedHashSet.class 
); 

簡單!我提供LinkedHashMap以用MultiValueMap行爲進行修飾,並指定用作值的集合類型(LinkedHashSet)。但是這需要投射時,我打電話put()get(),所以我想能夠使用4.0提供的新的通用版本。

回答

5

我諮詢了Apache Commons Collections中mailing list,其中it was explained to me對於MultiValueMap接口是衆所周知的缺乏,但將在4.1版本(見here的JIRA進行技術改造問題和相關討論)。

因此,未來我們可能會有更好的解決方案,但與此同時,正如Rohit Jain在他的回答中所提到的,我們將不得不壓制一些警告。然而,由於類型安全的關鍵方面是MultiValueMap(不是自定義集合型),實現這一目標的最簡單方法是:

@SuppressWarnings({ "rawtypes", "unchecked" }) 
MultiValueMap<String, String> orderedMap = 
    MapUtils.multiValueMap(new LinkedHashMap(), LinkedHashSet.class); 

注意使用MapUtils工廠方法,而不是更直接MultiValueMap我在原來的問題中使用過。

+0

多數民衆贊成在一個恥辱,SetValuedMap看起來像我想要的 –

1

問題是你需要通過一個Class<LinkedHashSet<String>>作爲第二個參數。你不能直接創建。你需要做一些演員。

這將很好地工作:

@SuppressWarnings("unchecked") 
MultiValueMap<String, String> orderedMap = 
      MultiValueMap.multiValueMap(
       new LinkedHashMap<String, Collection<String>>(), 
       (Class<LinkedHashSet<String>>)(Class<?>)LinkedHashSet.class 
      ); 
+0

感謝您的回覆。我已經嘗試過了,這當然有效。不過,雙投卻讓我感到困擾。這和我必須添加的所有泛型類型參數似乎打敗了我首先使用這個類的通用版本的意圖 - 這是爲了簡化我的代碼。 :\ –

+0

@RyanBennetts它​​肯定會讓你的代碼更安全。但是,有一些這樣的角落案例,你必須做這樣的事情。 –

相關問題