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

使用Comparator.comparing和thenComparing时Java编译器报错原因排查

问题原因与解决方案

问题根源

编译器报错是因为泛型类型推断失败:在Comparator.comparing(p->p.getAge())这段代码里,编译器无法自动推断lambda表达式中的参数p是Person类型,默认将其识别为Object类,而Object类并没有getAge()和getName()方法,因此抛出错误。

两种解决办法

1. 显式指定lambda参数的类型

在lambda参数前明确标注Person类型,让编译器明确p的实例类型:

@Test
public void testComparator() {
    List<Person> persons = Person.getPersons();
    persons.sort(Comparator.comparing((Person p) -> p.getAge()).thenComparing((Person p) -> p.getName()));
    System.out.println(persons);
}

2. 使用方法引用(更简洁推荐)

方法引用可以直接关联Person类的方法,编译器能准确推断类型,代码更简洁易读:

@Test
public void testComparator() {
    List<Person> persons = Person.getPersons();
    persons.sort(Comparator.comparing(Person::getAge).thenComparing(Person::getName));
    System.out.println(persons);
}

验证结果

修正后运行测试代码,输出会按age升序、name字典序排列:

[Person{name='Don', age=27}, Person{name='Tom', age=27}, Person{name='Jack', age=29}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 08:20:22