У меня странная ошибка компилятора при попытке использовать методы Comparator comparing и thenComparing для объединения компараторов в цепочку. У меня есть список кортежей, и я хочу сначала отсортировать список по первому элементу всех кортежей, а в случае дублирования я хочу отсортировать по второму элементу.
В первой попытке я создаю компаратор поэтапно. На сравнение первого элемента кортежей ссылается локальная переменная c1. Затем компаратор второго элемента создается из этой переменной.
Во второй попытке я встраиваю конструкцию компаратора первого элемента и go без каких-либо локальных переменных. Я бы предположил, что код идентичен предыдущей попытке, но внезапно компилятор помечает код как ошибку времени компиляции.
public class Example {
public static class Tuple<A, B> {
private final A a;
private final B b;
public Tuple(A a, B b) {
this.a = a;
this.b = b;
}
public A getA() {return a;}
public B getB() {return b;}
}
{
List<Tuple<Integer, String>> tuples = new ArrayList<>();
Comparator<Tuple<Integer, String>> c1 = Comparator.comparing(Tuple::getA);
// Attemp 1) compiles
tuples.sort(c1.thenComparing(Comparator.comparing(Tuple::getB)));
// Attemp 2) does not compile.
// compiler error: Cannot infer type argument(s) for <T, U> comparing(Function<? super T,? extends U>)
tuples.sort(Comparator.comparing(Tuple::getA).thenComparing(Comparator.comparing(Tuple::getB)));
// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
}
}
Мне здесь не хватает чего-то очень простого? По моему мнению, подобное встраивание никогда не должно приводить к ошибке времени компиляции. Может это ошибка компилятора? В конце концов, я использую предварительную версию JDK 14. Было бы неплохо узнать, есть ли у других такая же проблема со старыми версиями JDK.