5

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

我想要一个MultiValueMap以字符串为键,以字符串集合为值的方法。但:

  1. 键应保留插入顺序(因此我通过装饰 a 创建多值映射LinkedHashMap
  2. 每个键的值应该是唯一的并保留插入顺序(所以我希望值 Collection 类型为 a LinkedHashSet)。

我能得到的最接近的是:

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 提供的新通用版本。

4

2 回答 2

5

我查阅了 Apache Commons Collections邮件列表向我解释说,该接口MultiValueMap已知缺少,但将在 4.1 版中进行改进(有关 JIRA 问题和相关讨论,请参见此处)。

因此,将来我们可能会有更好的解决方案,但与此同时,正如 Rohit Jain 在他的回答中提到的那样,我们将不得不取消一些警告。但是,由于类型安全的关键方面是针对MultiValueMap(而不是自定义集合类型),实现这一点的最简单方法是:

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

请注意MapUtils工厂方法的使用,而不是MultiValueMap我在原始问题中使用的更直接的方法。

于 2014-04-01T03:20:10.527 回答
1

问题是你需要传递一个Class<LinkedHashSet<String>>作为第二个参数。你不能直接创建。你需要做一些演员表。

这将正常工作:

@SuppressWarnings("unchecked")
MultiValueMap<String, String> orderedMap = 
           MultiValueMap.multiValueMap(
                new LinkedHashMap<String, Collection<String>>(), 
                (Class<LinkedHashSet<String>>)(Class<?>)LinkedHashSet.class
           );
于 2014-03-25T04:44:36.443 回答