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

