java如何在自定义收集器时替换通配符泛型。托马普
我有一个基本上是toMap的收集器函数,但始终是LinkedHashMap,因为我经常需要它。声纳抱怨说有什么问题?返回类型中的通配符泛型。鉴于这是与toMap方法完全相同的签名,我任由它摆布,我如何用适当的值或泛型替换通配符
我已经尝试了Map<K,U>
并添加了M extends Map<K,U>
和LinkedHashMap版本,但是没有编译任何东西
有什么建议吗
或者这是不可能的,因为我使用的是收集器。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 楼答案
只要你使用^{,这是不可能的
可以复制并粘贴该函数(以及它所依赖的
mapMerger()
函数),将返回类型声明为Collector<T, LinkedHashMap<K,U>, LinkedHashMap<K,U>>
。但我认为最好保持代码干净,处理声纳。也许有一种方法可以表明这是一个假阳性,并抑制来自声纳的警告