栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

JavaComparator.reversed()不使用lambda进行编译

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

JavaComparator.reversed()不使用lambda进行编译

这是编译器的类型推断机制的一个弱点。为了推断ulambda的类型,需要建立lambda的目标类型。这是如下完成的。

userList.sort()
期待类型为的参数
Comparator<User>
。在第一行中,
Comparator.comparing()
需要返回
Comparator<User>
。这意味着
Comparator.comparing()
需要一个
Function
User
参数的a 。因此,在第一行的
lambda
中,
u
必须为
type User
并且一切正常。

在第二行和第三行中,对的调用会干扰目标类型

reversed()
。我不完全清楚为什么。接收器和的返回类型
reversed()
都是
Comparator<T>
如此,因此似乎应该将目标类型传播回接收器,但事实并非如此。(就像我说的那样,这是一个缺点。)

在第二行中,方法参考提供了填补此空白的其他类型信息。第三行缺少此信息,因此编译器推断u为

Object
(失败的推断回退),这将失败。

显然,如果可以使用方法引用,则可以使用它。有时你不能使用方法引用,例如,如果你想传递附加参数,则必须使用lambda表达式。在这种情况下,你可以在lambda中提供一个明确的参数类型:

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

在将来的发行版中,可能会增强编译器以涵盖这种情况。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/420291.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号