首页 >Java >java教程 >为什么 `Comparator.comparing().reversed()` 会导致 Lambda 出现编译器错误?

为什么 `Comparator.comparing().reversed()` 会导致 Lambda 出现编译器错误?

Susan Sarandon
Susan Sarandon原创
2024-12-20 17:22:10261浏览

Why Does `Comparator.comparing().reversed()` Cause a Compiler Error with Lambdas?

使用 Lambda 理解 Comparator.reversed() 中的编译器错误

尝试使用 lambda 表达式对 User 对象列表进行排序时比较器,如:

List<User> userList = Arrays.asList(u1, u2, u3);
userList.sort(Comparator.comparing(u -> u.getName()).reversed());

编译器可能会显示错误指出它无法在 lambda 的 u 变量中找到 getName() 方法。此问题源于编译器类型推断机制的弱点。

要解决此错误,我们需要为 lambda 建立目标类型。使用 Comparator.comparing() 进行排序时,lambda 必须采用与列表中的对象类型相同的参数。

在代码的第一行中,我们使用方法引用,目标类型从方法参数类型推断出来,即User。这使得编译器能够正确推断 lambda 中 u 的类型。

但是,在第三行中,我们使用 lambda 表达式而不是方法引用,对 returned() 的调用会破坏目标类型推理。编译器无法将目标类型传播回接收者,从而使 u 具有推断的 Object 类型,该类型没有 getName() 方法。

要解决此问题,我们可以使用方法引用或在 lambda 中显式指定 u 的类型,如下所示:

userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());

这确保编译器可以推断 lambda 中 u 的正确类型,并根据指定成功对列表进行排序比较器。

以上是为什么 `Comparator.comparing().reversed()` 会导致 Lambda 出现编译器错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn