gpt4 book ai didi

java - 尽管推断出 Long,但 Collectors.maxBy(Comparator.naturalOrder()) 无法编译

转载 作者:行者123 更新时间:2023-12-01 13:55:08 24 4
gpt4 key购买 nike

我无法编译以下代码(在 onlinegdb 尝试):

List<Container<Dto>> list = Arrays.asList(
new Container<>(new Dto("A"), 10L),
new Container<>(new Dto("A"), 30L),
new Container<>(new Dto("B"), 30L));

Map<String, Optional<Long>> mapWrong = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(
Container::getDifference,
Collectors.maxBy(Comparator.naturalOrder())))); // DOESN'T WORK WITH THIS

incompatible types: cannot infer type-variable(s) T,U,A,R,capture#2 of ?,T,T(argument mismatch; invalid method referencemethod getDifference in class Container cannot be applied to given typesrequired: no argumentsfound: java.lang.Objectreason: actual and formal argument lists differ in length)


我不知道是什么导致了编译错误。 Collectors.mapping将一个对象映射到一个新值,并且自 Container::getDifference 返回 long 并且应该将完全相同的类型推断为 Collectors.maxBy并且代码应该被编译。
令人惊讶的是,当我更换 Comparator.naturalOrder() 时与 Comparator.comparingLong(l -> l) ,那么它就起作用了。
Map<String, Optional<Long>> mapCorrect = list.stream()
.collect(Collectors.groupingBy(
c -> c.getOutput().getType(),
Collectors.mapping(
Container::getDifference,
Collectors.maxBy(Comparator.comparingLong(l -> l))))); // A CHANGE TO FIX IT
使用的对象(包括 all-args 构造函数和 getter):
public class Container<T> {
T output;
long difference;
}
public class Dto {
String type;
}
请注意,这可以使用 OpenJDK 重现 jdk-11.0.5jdk1.8.0_212 .我使用 IntelliJ Idea 并且 IDE 没有突出显示此类错误,但是在编译时会引发该错误。

最佳答案

标准 Oracle/OpenJDK 编译器(版本 8 到 14)的推理引擎无法正确跟踪正在发生的事情。
但是,Eclipse 的编译器可以,这就是其他人说他们无法重现该问题的原因。
您需要通过指定来帮助它:

Collectors.maxBy(Comparator.<Long>naturalOrder()))));     // THIS NOW WORKS

关于java - 尽管推断出 Long,但 Collectors.maxBy(Comparator.naturalOrder()) 无法编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63509530/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com