Невозможно определить аргумент типа Comparator, если не используется локальная переменная - PullRequest
0 голосов
/ 06 августа 2020

У меня странная ошибка компилятора при попытке использовать методы 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.

1 Ответ

0 голосов
/ 06 августа 2020

Как отметил в комментарии chrylis -cautiouslyoptimisti c - это действительно проблема с IDE, которую я использую (в этом случае я использовал Eclipse 2020-06 (4.16.0)), а не Java Компилятор. Когда я компилирую файл с помощью командной строки, он работает нормально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...