Java比较器类型推断混乱
对于下面的代码示例,我有几个问题Java比较器类型推断混乱,java,comparator,Java,Comparator,对于下面的代码示例,我有几个问题 class HypotheticComparators { class Pair<U,T> { private U left; private T right; public U getLeft() { return left } public T getRight() { return right;
class HypotheticComparators {
class Pair<U,T> {
private U left;
private T right;
public U getLeft() {
return left
}
public T getRight() {
return right;
}
}
class User {
private String name;
private Integer age;
public String getName(){
return name;
}
public Integer getAge() {
return age;
}
}
public static void main(String[] args){
List<Pair<LocalDate,LocalDate>> dataIntevals = new ArrayList<>();
//Doesn't Compile
Comparator<Pair<LocalDate,LocalDate>> pairComparator1 = Comparator.comparing(Pair::getLeft).thenComparing(Pair::getRight);
//This Compile
Comparator<Pair<LocalDate,LocalDate>> leftComparator = Comparator.comparing(Pair::getLeft);
Comparator<Pair<LocalDate,LocalDate>> pairComparator2 = leftComparator.thenComparing(Pair::getRight));
//This compile
Comparator<User> userComparator1 = Comparator.comparing(User::getName).thenComparing(User::getAge);
//This also compile
Comparator<User> userNameComparator = Comparator.comparing(User::getName);
Comparator<User> userComparator2 = userNameComparator.thenComparing(User::getAge);
}
}
Comparator.comparing(Pair::getLeft)
可以使用T作为Pair
进行类型推断,themComparing
也可以使用T作为Pair
进行类型推断。此外,如果我的想法是正确的,为什么comparatorusernamecomparator=Comparator.comparating(User::getName)代码>可以毫无问题地编译。我在这里遗漏了什么吗?Java类型推断器无法确定第一个。比较将接受与第二个相同的类型,因此它猜测第一个方法的类型是对象、Pair
,并且对象没有实现可比性。您可以通过为方法指定泛型类型来解决此问题:
Comparator<Pair<LocalDate,LocalDate>> pairComparator1 = Comparator
.<Pair<LocalDate, LocalDate>, LocalDate>comparing(Pair::getLeft)
.thenComparing(Pair::getRight);
Comparator pairComparator1=比较器
.比较(对::getLeft)
.然后比较(对::getRight);
编译器在第一种情况下无法推断Pair::getLeft
的类型,但在第二种情况下可以推断,原因是它使用变量的类型来推断类型,但由于您立即调用thenComparing()
,因此它无法访问此信息
您可以通过使用Comparator.comparing(Pair::getLeft)来检查这一点代码>本身在新行上,而不将其保存到变量。编译器将无法推断类型
这可以通过显式地说Pair::getLeft
来解决
Comparator<Pair<LocalDate,LocalDate>> pairComparator1 = Comparator
.<Pair<LocalDate, LocalDate>, LocalDate>comparing(Pair::getLeft)
.thenComparing(Pair::getRight);