使用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
相关产品推荐
相关产品推荐

