我无法编译以下代码(请尝试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
不兼容类型:无法推断类型变量t、u、a、r、capture#2 of?、t、t(参数不匹配;类容器中的无效方法引用方法getdifference无法应用于给定类型(必需:找不到参数:java.lang.object原因:实际参数列表和形式参数列表长度不同)
我不知道是什么导致了编译错误。这个 Collectors.mapping
将对象Map到新值,然后 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
使用的对象(包括所有参数构造函数和getter):
public class Container<T> {
T output;
long difference;
}
public class Dto {
String type;
}
注意,使用openjdk和 jdk-11.0.5
以及 jdk1.8.0_212
. 我使用intellij idea,ide并没有突出这种错误,但是在编译时会出现这种错误。
1条答案
按热度按时间yebdmbv41#
标准的oracle/openjdk编译器(版本8到14)的推理机无法正确跟踪正在发生的事情。
然而,eclipse的编译器可以,这就是为什么其他人说他们不能重现这个问题。
您需要通过指定以下内容来帮助它: