我有一个收集器函数,它基本上是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);
}
以下是声纳规则的全文:
通用通配符类型不应用于返回参数
隐式使用通配符作为返回类型意味着返回值应被视为只读,但无法强制执行此合同。
让我们以返回List<? extends Animal>
的方法为例。在此列表中是否可以添加狗,猫,......我们根本不知道。方法的消费者不应该处理这种破坏性问题。
List<? extends Animal> getAnimals(){...}
答案 0 :(得分:4)
只要您使用Collections.toMap()
就。
您可以复制并粘贴该函数(以及它所依赖的mapMerger()
函数),将返回类型声明为Collector<T, LinkedHashMap<K,U>, LinkedHashMap<K,U>>
。但我认为保持代码清洁并处理Sonar会更好。也许有一种方法可以表明这是误报,并抑制了声纳的警告。