Использование анонимного класса в методе сортировки

Почему, если я поместил анонимный класс с Comparator в метод сортировки List, компилятор покажет мне ошибку?

Мой код:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   l.sort(Comparator<String> c= new Comparator<>() {   //compiler error
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   });

}

Метод sort принимает компаратор. Если я напишу этот код, он скомпилирует:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   l.sort(new Comparator<String>() {                  //it's ok
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   });

}

Или этот код:

public class Example2 {

public static void main(String[] args) {
   List<String> l = Arrays.asList("a","b","c","d");
   Comparator <String> c = new Comparator<String>() {     
        public int compare(String a, String b) {
            return b.compareTo(a);
        }
   };
   l.sort(c);                               //it's ok

}

Почему это происходит?

Большое спасибо!

3 ответа

Решение

Первый отказывает, поскольку это назначение. Метод sort ожидает объект класса Comparator. Поэтому, когда вы говорите sort(новый Comparator), вы создаете новый Comparator и немедленно передаете его в метод sort. Если у вас есть Comparator c = new Comparator (), а затем у вас есть sort(c), вы создаете новый Comparator, сохраняете его в переменной c и передаете его в метод sort.

Первый сегмент кода пытается присвоить новый компаратор переменной c и передать его в метод sort, синтаксис java не позволяет этого. Аналогично иметь метод, который принимает одно целое число в качестве аргумента, и писать foo(int bar = 7). Это не совсем имеет смысла.

Во втором примере вы не предоставляете компаратор методу, вы назначаете его для ссылки 'c'. В третьем примере вы присваиваете его ссылке c, а затем передаете его методу sort.

Надеюсь это поможет:)

Проблема здесь не в том, что вы передаете анонимный класс.

l.sort(Comparator<String> c= new Comparator<>() { ... });

Это пытается объявить переменную, c, Объявления переменных являются операторами, и поэтому их нельзя использовать внутри выражений. (Вы также не можете использовать оператор diamond при объявлении анонимного класса).

Если вы хотите объявить переменную для хранения этого компаратора и назначить ее внутри вызова сортировки, вы можете, например, так:

Comparator<String> c;
l.sort(c = new Comparator<String>() { ... });

но я подозреваю, что это не то, что вы хотели.

Другие вопросы по тегам