-1
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

4

1 回答 1

3

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


我假设Iterables.getOnlyElement来自番石榴。

问题在于这一行:

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)));
于 2020-10-06T00:37:35.323 回答