java比较器。比较不能推断正确的输入类型
我有一个人:
class Person{
String name;
int age;
Date birth;
//getters and setters
}
List<Person> persons = retrievePersons();
现在我想根据出生(MM/DD/YY格式)对其进行排序,例如第一个排序参数将是month和second day
我试着用
int extractMonth(Date date){...}
int extractDay(Date date){...}
persons= persons.stream()
.sorted(
Comparator.comparing( element -> extractMonth(element.getBirth()))
).collect(Collectors.toList());
这是可行的,但是当我添加thenComparing()
persons= persons.stream()
.sorted(
Comparator.comparing( element -> extractMonth(element.getBirth()))
.thenComparing(element -> extractDay(element.getBirth())
).collect(Collectors.toList());
这导致了错误:
cannot resolve method getBirth()
在两种比较方法中
为什么会这样?卡林比较仪。在比较泛型时,比较应该将T设置为Person
但如果我手动指定输入和输出:
persons= persons.stream()
.sorted(
Comparator.<Person,Integer>comparing( element -> extractMonth(element.getBirth()))
.thenComparing(element -> extractDay(element.getBirth())
).collect(Collectors.toList());
它有效。。。为什么
# 1 楼答案
如果要排序的对象在lambda声明中的任何地方都不是显式类型,Java需要参数类型推断方面的帮助
在这种情况下,您只能推断比较器将比较
Person
,因为它包含在Person流的操作中。虽然我没有证据证明编译器就是这么做的,但如果你只看一下创建比较器本身的代码行,没有任何迹象表明Person
涉及其中。因此,唯一安全的推断是,您正在比较Object
你只需使用
Comparator.comparingInt()
即可:这同样有效(将初始对象声明为个人):
或者这个(方法直接接受
Person
):