gpt4 book ai didi

java - 为什么使用基类作为方法引用会导致编译器错误

转载 作者:搜寻专家 更新时间:2023-11-01 03:16:14 25 4
gpt4 key购买 nike

我正在使用 Comparator 对流进行排序,但遇到了一个我无法理解的编译器错误。

假设我有以下类(class):

class Base {
private LocalDate date;
public LocalDate getDate() { return date; }
...
}
class Sub extends Base { ... }

我正在创建两个比较器来按日期对 Sub 进行排序,一个按自然顺序,一个按相反顺序。编译以下代码:

Comparator<Sub> fwd = Comparator.comparing(Sub::getStartDate);
Comparator<Sub> rev1 = Comparator.comparing(Sub::getStartDate).reversed();
Comparator<Sub> rev2 = fwd.reversed();

意识到 getDate() 是在 Base 上定义的,我想我会尝试以下操作:

Comparator<Sub> fwd = Comparator.comparing(Base::getStartDate);
Comparator<Sub> rev1 = Comparator.comparing(Base::getStartDate).reversed(); // Compiler error
Comparator<Sub> rev2 = fwd.reversed(); // OK

令我惊讶的是,rev2 的代码编译正常,而 rev1 的代码产生以下错误:

Cannot infer type argument(s) for <T, U> comparing(Function<? super T, ? extends U>)
The type Base does not define getStartDate(Object) that is applicable here

为什么会出现这些编译器错误?为什么我可以在从 fwd 构建 rev2 时有效地绕过它们?

(如果相关的话,我正在使用 Eclipse Oxygen.3a (4.7.3) 和 Java v1.8.0_162。)

最佳答案

如前所述answer , 目标类型被 reversed() 的调用打断:

Comparator<Sub> rev1 =
Comparator.comparing(Base::getStartDate)
.reversed(); // Compiler error - incompatible types

在这种情况下,编译器似乎会推断出以下类型参数:

Comparator<Sub> rev1 =
Comparator.<Base, LocalDate>comparing(Base::getStartDate)
.reversed(); // Compiler error - incompatible types

要消除错误,您可以显式提供类型参数:

Comparator<Sub> rev1 =
Comparator.<Sub, LocalDate>comparing(Base::getStartDate)
.reversed(); // Okay, no problem

或者使用两个参数 Comparator.comparing() :

Comparator<Sub> rev1 =
Comparator.comparing(Base::getStartDate, Comparator.reverseOrder());

关于java - 为什么使用基类作为方法引用会导致编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50779662/

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