Apache Commons Collections库的4.0版本增加了泛型支持。我在转换代码以利用它方面遇到麻烦:

我想要一个 MultiValueMap ,它使用String作为键,并将String的集合作为值。但:

  • 键应保留插入顺序(因此我创建了
    通过装饰 LinkedHashMap )
  • 获得多值 map
  • 值应为
    每个键唯一,并保留插入顺序(所以我想要
    values集合类型为 LinkedHashSet )。

  • 我能得到的最接近的是:
    MultiValueMap<String, String> orderedMap = MultiValueMap.multiValueMap(
        new LinkedHashMap<String, Collection<String>>(),
        LinkedHashSet.class
    );
    

    但这会产生错误:



    所以现在我处于泛型 hell 。任何建议将是最欢迎的。

    在4.0版之前,我通过以下操作完成了此操作:
    MultiValueMap orderedMap = MultiValueMap.decorate(
        new LinkedHashMap<>(),
        LinkedHashSet.class
    );
    

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

    最佳答案

    我咨询了Apache Commons Collections的mailing list,其中it was explained to me缺少MultiValueMap的接口(interface),但是在4.1版中将对其进行了修订(有关JIRA问题和相关讨论,请参见here)。

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

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

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

    09-26 10:33