首页 >Java >java教程 >为什么'Comparator.reversed()”会导致 Java Lambda 表达式编译错误?

为什么'Comparator.reversed()”会导致 Java Lambda 表达式编译错误?

Susan Sarandon
Susan Sarandon原创
2024-12-15 06:22:11192浏览

Why Does `Comparator.reversed()` Cause Compilation Errors with Java Lambda Expressions?

编译器陷阱:Comparator.reversed() 和 Lambda 表达式

Lambda 表达式提供了一种简洁的方法来自定义排序行为,但是当与Comparator.reversed(),出现编译错误。此错误源于编译器无法推断 lambda 的正确目标类型。

理解错误

请考虑以下示例代码:

userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error

在这种情况下,会出现错误,因为编译器无法确定 lambda 表达式中参数 u 的类型。为了推断类型,编译器需要 lambda 的目标类型。

通常,目标类型是由使用 lambda 的上下文建立的。在您提供的代码片段的第一行中,目标类型是 Comparator,因为 userList.sort() 需要该类型的参数。这推断 u 是 User 类型,允许代码编译。

Lambda 与方法引用

仅在使用 lambda 表达式时才会发生该错误。使用方法引用时(如代码片段的第二行),目标类型由方法签名显式提供,从而解决类型推断问题。

解决错误

要解决使用 lambda 表达式时的错误,可以显式提供参数类型:

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

这个显式指定 u 为 User 类型,允许编译器正确推断目标类型。

编译器弱点

相关错误突出了编译器类型的弱点推理机制。 reversed() 方法破坏目标类型的确切原因尚不清楚。未来的编译器增强功能可能会解决这个问题,允许在没有显式参数输入的情况下使用 lambda 表达式。

以上是为什么'Comparator.reversed()”会导致 Java Lambda 表达式编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

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