Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java比较器类型推断混乱_Java_Comparator - Fatal编程技术网

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);