Использование анонимного класса в методе сортировки
Почему, если я поместил анонимный класс с 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>() { ... });
но я подозреваю, что это не то, что вы хотели.