获取编译时错误推理变量 T 具有不兼容的边界

Getting compile time error Inference variable T has incompatible bounds

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

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


我假设 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)));