Double::isFinite与Double::isInfinite用法差异及编译报错问题
问题原因分析
核心差异在于Double类中isFinite与isInfinite的方法定义存在本质区别:
1. Double::isFinite无匹配歧义
你提供的源码仅展示了isFinite的静态方法:
public static boolean isFinite(double d) { return Math.abs(d) <= Double.MAX_VALUE; }
实际上Double类没有定义实例方法isFinite(),因此当你用Double::isFinite作为Predicate<Double>时,编译器只能匹配这唯一的静态方法——它会自动将Double对象拆箱为double参数,等价于lambda表达式:
d -> Double.isFinite(d)
不存在其他可选匹配,编译自然无歧义。
2. Double::isInfinite存在方法引用歧义
Double类同时存在两个同名方法:
- 静态方法:
public static boolean isInfinite(double v)(你提供的源码) - 实例方法:
public boolean isInfinite()(属于Double类标准方法,未在你贴的代码中展示)
当你使用Double::isInfinite作为Predicate<Double>时,编译器能匹配两种合法逻辑:
- 匹配静态方法:自动拆箱
Double为double,执行Double.isInfinite(d) - 匹配实例方法:直接调用
Double对象的实例方法d.isInfinite()
两种匹配都符合Predicate<Double>的函数签名(输入Double、返回boolean),编译器无法自动判断你的意图,因此抛出歧义报错。
解决办法
通过lambda表达式明确指定逻辑,消除歧义:
// 明确使用静态方法 Collectors.filtering(d -> Double.isInfinite(d), Collectors.counting()) // 或者明确使用实例方法 Collectors.filtering(d -> d.isInfinite(), Collectors.counting())
内容的提问来源于stack exchange,提问作者traveh
相关产品推荐
相关产品推荐

