编译器陷阱:Comparator.reversed() 和 Lambda 表达式
Lambda 表达式提供了一种简洁的方法来自定义排序行为,但是当与Comparator.reversed(),出现编译错误。此错误源于编译器无法推断 lambda 的正确目标类型。
理解错误
请考虑以下示例代码:
userList.sort(Comparator.comparing(u -> u.getName()).reversed()); // Compiler error
在这种情况下,会出现错误,因为编译器无法确定 lambda 表达式中参数 u 的类型。为了推断类型,编译器需要 lambda 的目标类型。
通常,目标类型是由使用 lambda 的上下文建立的。在您提供的代码片段的第一行中,目标类型是 Comparator
Lambda 与方法引用
仅在使用 lambda 表达式时才会发生该错误。使用方法引用时(如代码片段的第二行),目标类型由方法签名显式提供,从而解决类型推断问题。
解决错误
要解决使用 lambda 表达式时的错误,可以显式提供参数类型:
userList.sort(Comparator.comparing((User u) -> u.getName()).reversed());
这个显式指定 u 为 User 类型,允许编译器正确推断目标类型。
编译器弱点
相关错误突出了编译器类型的弱点推理机制。 reversed() 方法破坏目标类型的确切原因尚不清楚。未来的编译器增强功能可能会解决这个问题,允许在没有显式参数输入的情况下使用 lambda 表达式。
以上是为什么'Comparator.reversed()”会导致 Java Lambda 表达式编译错误?的详细内容。更多信息请关注PHP中文网其他相关文章!