如何在自定义Collectors.toMap时替换通配符

时间:2017-06-14 18:16:28

标签: java generics sonarqube collectors

我有一个收集器函数,它基本上是toMap,但总是一个LinkedHashMap,因为我经常需要它。声纳有抱怨吗?返回类型中的通配符泛型。因为这与toMap方法的签名完全相同,而且我怜悯,如何用适当的值或泛型替换通配符?

我已尝试Map<K,U>并添加了M extends Map<K,U>和LinkedHashMap版本,但没有编译。

有什么建议吗?

或者这是不可能的,因为我正在使用使用通配符的Collectors.toMap?

public static <T, K, U> Collector<T, ?, LinkedHashMap<K, U>> toLinkedHashMap(
        Function<? super T, ? extends K> keyMapper,
        Function<? super T, ? extends U> valueMapper,
        BinaryOperator<U> merger) {
    return Collectors.toMap(keyMapper, valueMapper, merger, LinkedHashMap::new);
}

以下是声纳规则的全文:

通用通配符类型不应用于返回参数

代码气味

主要

鱿鱼:S1452

隐式使用通配符作为返回类型意味着返回值应被视为只读,但无法强制执行此合同。 让我们以返回List<? extends Animal>的方法为例。在此列表中是否可以添加狗,猫,......我们根本不知道。方法的消费者不应该处理这种破坏性问题。

不符合规范的代码示例

List<? extends Animal> getAnimals(){...}

1 个答案:

答案 0 :(得分:4)

只要您使用Collections.toMap() 就。

您可以复制并粘贴该函数(以及它所依赖的mapMerger()函数),将返回类型声明为Collector<T, LinkedHashMap<K,U>, LinkedHashMap<K,U>>。但我认为保持代码清洁并处理Sonar会更好。也许有一种方法可以表明这是误报,并抑制了声纳的警告。