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

使用Comparator.comparing(BigDecimal::new).reversed()遇类型不兼容错误

问题分析与解决

错误原因

你遇到的编译错误核心是泛型类型推断失败。当使用Comparator.comparing(BigDecimal::new)时,编译器无法自动推断出构造方法引用对应的Function输入类型是String——它默认把输入类型当成了Object,而BigDecimal并没有接收Object类型参数的构造方法,因此抛出"找不到合适构造器"的错误。

修正方案

需要明确告诉编译器构造方法引用的输入参数是String类型,有两种可行的解决方式:

方式1:显式指定泛型参数

直接在comparing方法上声明泛型类型,让编译器明确T为String、U为BigDecimal:

s = Stream.of(s)
          .filter(x -> x != null)
          .sorted(Comparator.<String, BigDecimal>comparing(BigDecimal::new).reversed())
          .toArray(String[]::new);

方式2:改用Lambda表达式代替构造方法引用

用Lambda显式完成String到BigDecimal的转换,让编译器清晰识别输入类型:

s = Stream.of(s)
          .filter(x -> x != null)
          .sorted(Comparator.comparing(str -> new BigDecimal(str)).reversed())
          .toArray(String[]::new);

为什么最初的匿名Comparator写法没问题?

你最初的(x, y) -> new BigDecimal(y).compareTo(new BigDecimal(x))写法中,x和y的类型会被编译器自动推断为String(因为Stream的元素类型是String),所以new BigDecimal(x)能直接匹配BigDecimal(String)构造方法,不会出现类型推断异常。

内容的提问来源于stack exchange,提问作者Grey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 19:14:55