【问题标题】:Creating a Commons Collections MultiValueMap with a custom value collection type使用自定义值集合类型创建 Commons Collections MultiValueMap
【发布时间】:2014-05-02 18:20:40
【问题描述】:

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

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

  1. 键应该保持插入顺序(所以我创建 通过装饰 LinkedHashMap 来实现多值映射)
  2. 值应该是 每个键都是唯一的并保留插入顺序(所以我想要 values 集合类型为LinkedHashSet)。

我能得到的最接近的是:

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

但这会产生错误:

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

所以现在我陷入了泛型地狱。任何建议都将受到欢迎。

在 4.0 版之前,我通过以下方式实现了这一点:

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

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

【问题讨论】:

    标签: java generics apache-commons-collection


    【解决方案1】:

    我咨询了 Apache Commons Collections mailing list,其中 it was explained to me 已知缺少 MultiValueMap 的接口,但将在 4.1 版中进行改进(有关 JIRA 问题和相关讨论,请参阅 here) .

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

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

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

    【讨论】:

    • 真可惜,SetValuedMap 看起来像我想要的
    【解决方案2】:

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

    这样可以正常工作:

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

    【讨论】:

    • 感谢您的回复。我已经尝试过了,这确实有效。不过,双重演员让我很困扰。与我必须添加的所有泛型类型参数一起,这似乎违背了我最初使用此类的泛型版本的意图——这是为了简化我的代码。 :\
    • @RyanBennetts 它肯定会让你的代码更安全。但是,在某些极端情况下,您必须执行此类操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多