【问题标题】:Getting compile time error Inference variable T has incompatible bounds获取编译时错误推理变量 T 具有不兼容的界限
【发布时间】:2020-10-05 23:47:55
【问题描述】:
class CollectorUtils {
    private CollectorUtils() {
    }

    public static <T> Collector<T, ?, T> onlyElement() {
        return Collectors.collectingAndThen(Collectors.toList(), Iterables::getOnlyElement);
    }

    public static <T> Collector<T, ?, Optional<T>> optionalElement() {
        return Collectors.collectingAndThen(Collectors.toList(), (list) -> {
            return Optional.ofNullable(Iterables.getOnlyElement(list, (Object)null));
        });
    }

    public static <T> Collector<T, ?, List<T>> toList() {
        return Collectors.toCollection(ArrayList::new);
    }
}

我得到推理变量 T 的边界不兼容。

java:不兼容的类型:推理变量 T 具有不兼容的边界 等式约束:T 下界:T,java.lang.Object,T

【问题讨论】:

  • 你能显示minimal reproducible example吗? Iterables.getOnlyElement 是什么?
  • 当询问编译器错误时,请包括行号,或以其他方式指出编译器正在标记哪个节点。此外,请考虑粘贴任何涉及的代码,例如 Iterables.getOnlyElement。
  • 如果你完全使用 Guava 来获取Iterables.getOnlyElement,为什么不使用these collectors from that library

标签: java java-stream guava optional


【解决方案1】:

注意:在这个答案中,我只考虑编译错误。我不是在讨论问题的代码是否是最好的代码。


我假设 Iterables.getOnlyElement 来自 Guava。

问题出在这一行:

return Optional.ofNullable(Iterables.getOnlyElement(list, (Object) null));

改为将null 转换为T,以便编译器可以安全地推断所有类型:

return Optional.ofNullable(Iterables.getOnlyElement(list, (T) null));

此外,您还可以简化代码:

return Collectors.collectingAndThen(Collectors.toList(),
    list -> Optional.ofNullable(Iterables.getOnlyElement(list, (T) null)));

【讨论】:

  • 值得注意的是,该方法的结果是不一致的。它将带有单个 null 元素的流视为空流,返回一个空的可选项,但对包含两个 null 元素的流抛出异常。相比之下,更简单、更高效的 return Collectors.reducing((a,b) -&gt; { throw new IllegalArgumentException("multiple elements"); }); 的行为与 OP 似乎试图模仿的 MoreCollectors.toOptional() 完全相同。
  • @Holger 更不用说 OP 正在将整个流收集到一个列表中,只是为了返回它的第一个元素(如果存在)。在我的回答中,我只考虑了编译错误和语法
  • 好吧,getOnlyElement 方法应该在有多个元素时抛出,因此“收集整个流”仅在错误情况下代价高昂。尽管如此,toList() 的实现通常会生成默认容量为 10 的ArrayList,这对于获取零或一个元素是不必要的,因此这种方法会降低性能,这就是为什么我写了“更简单,更高效”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多