You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 15:45:34