gpt4 book ai didi

Java Comparator 类型推断混淆

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:47:57 25 4
gpt4 key购买 nike

我对以下代码示例几乎没有疑问。

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)可以使用 T 作为 Pair<LocalDate, LocalDate> 进行类型推断, themComparing也可以使用 T 作为 Pair<LocalDate, LocalDate> 进行类型推断.此外,如果我的想法是正确的,为什么Comparator<User> userNameComparator = Comparator.comparing(User::getName);可以毫无问题地编译。我在这里遗漏了什么吗?

最佳答案

Java 类型推断器无法确定第一个 .comparing将接受与第二个方法相同的类型,因此它猜测第一个方法的类型是 Object, Pair<LocalDate, LocalDate> ,并且 Object 没有实现 Comparable。您可以通过为方法指定泛型类型来解决此问题:

Comparator<Pair<LocalDate,LocalDate>> pairComparator1  = Comparator
.<Pair<LocalDate, LocalDate>, LocalDate>comparing(Pair::getLeft)
.thenComparing(Pair::getRight);

关于Java Comparator 类型推断混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49160661/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com