有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    只要你使用^{,这是不可能的

    可以复制并粘贴该函数(以及它所依赖的mapMerger()函数),将返回类型声明为Collector<T, LinkedHashMap<K,U>, LinkedHashMap<K,U>>。但我认为最好保持代码干净,处理声纳。也许有一种方法可以表明这是一个假阳性,并抑制来自声纳的警告