获取编译时错误推理变量 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)));
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)));