Использование анонимного класса в методе сортировки - PullRequest
0 голосов
/ 10 ноября 2018

почему, если я добавлю анонимный класс с 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);
        }
   });

}

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

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 ]

0 голосов
/ 10 ноября 2018

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

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

0 голосов
/ 11 ноября 2018

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

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

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

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

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

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

0 голосов
/ 10 ноября 2018

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

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

...