以下代码示例有几个问题:
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<Pair<LocalDate,LocalDate>> pairComparator1 = Comparator.comparing(Pair::getLeft).thenComparing(Pair::getRight);
,我最初的想法是themComparaing
无法从Comparator.comparing(Pair::getLeft)
中推断出类型而无法编译。但我对这个想法并不满意,因为查看Comparator.comparing
和thenComparing
的源代码,它们都被正确地泛型化了。public static <T, U extends Comparable<? super U>> Comparator<T> comparing(
Function<? super T, ? extends U> keyExtractor)
{
Objects.requireNonNull(keyExtractor);
return (Comparator<T> & Serializable)
(c1, c2) -> keyExtractor.apply(c1).compareTo(keyExtractor.apply(c2));
}
default <U extends Comparable<? super U>> Comparator<T> thenComparing(
Function<? super T, ? extends U> keyExtractor)
{
return thenComparing(comparing(keyExtractor));
}
Comparator.comparing(Pair::getLeft)
可以对类型为 Pair<LocalDate, LocalDate>
的 T 进行类型推断,thenComparing
也可以对类型为 Pair<LocalDate, LocalDate>
的 T 进行类型推断。此外,如果我的想法是正确的,为什么 Comparator<User> userNameComparator = Comparator.comparing(User::getName);
可以编译通过而没有任何问题。我是否漏掉了什么?