2014-03-25 46 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它​​肯定会让你的代码更安全。但是,有一些这样的角落案例,你必须做这样的事情。 –

相关问题