使用自定义值集合类型创建Commons Collections MultiValueMap

时间:2014-03-25 04:39:51

标签: java generics apache-commons-collection

Apache Commons Collections库的4.0版本增加了泛型支持。我无法转换代码以利用它:

我想要一个MultiValueMap,它将String作为键,并将一个字符串集合作为值。但是:

  1. 键应该保留插入顺序(所以我创建了 通过装饰LinkedHashMap
  2. 的多值地图
  3. 值应该是 每个键都是唯一的,并保留插入顺序(所以我想要 值集合类型为LinkedHashSet)。
  4. 我能得到的最接近的是:

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

    但这会产生错误:

      

    类型中的方法multiValueMap(Map<K,? super C>, Class<C>)   MultiValueMap不适用于参数   (LinkedHashMap<String,Collection<String>>, Class<LinkedHashSet>)

    所以现在我在仿制药地狱。任何建议都是最受欢迎的。

    在4.0版之前,我完成了以下内容:

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

    简单!我提供LinkedHashMap来装饰MultiValueMap行为,并指定要用作值的集合类型(LinkedHashSet)。但是,当我致电put()get()时,这需要投射,因此我希望能够使用4.0提供的新通用版本。

2 个答案:

答案 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

答案 1 :(得分:1)

问题是您需要传递Class<LinkedHashSet<String>>作为第二个参数。你无法直接创造。你需要做一些演员。

这样可以正常工作:

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