#java #new-operator #method-reference
#java #новый-оператор #ссылка на метод
Вопрос:
Я знаю, что существует четыре ссылки на метод:
-
Класс::новый
-
Класс:: статический метод
-
экземпляр:: метод экземпляра
-
Класс :: метод экземпляра
В этом упражнении я обнаружил другую форму ссылки на метод и хочу спросить вас, как это возможно.
class Person{
String name;
String dob;
public Person(String name, String dob){
this.name = name; this.dob = dob;
}
}
class MySorter {
public int compare(Person p1, Person p2){
return p1.dob.compareTo(p2.dob);
}
}
public class SortTest {
public static int diff(Person p1, Person p2){
return p1.dob.compareTo(p2.dob);
}
public static int diff(Date d1, Date d2){
return d1.compareTo(d2);
}
public static void main(String[] args) {
ArrayList<Person> al = new ArrayList<>();
al.add(new Person("Paul", "01012000"));
al.add(new Person("Peter", "01011990"));
al.add(new Person("Patrick", "01012002"));
//INSERT CODE HERE
}
}
В этом упражнении необходимо указать, сколько из приведенных выше строк можно вставить в данный код независимо друг от друга, чтобы отсортировать список, на который ссылается al:
- java.util.Collections.sort(al, (p1, p2)->p1.dob.compareTo(p2.dob));
- java.util.Collections.sort(al, SortTest::diff);
- java.util.Collections.sort(al, новый MySorter()::compare);
Я думал, что правильными ответами были 1 и 2. Но решение этого упражнения указывает как правильные все строки (1, 2 и 3).
Как возможно создать «новый класс:staticMethod»?
Большое спасибо!
A.
Комментарии:
1.
new MySorter()
возвращает экземплярMySorter
иcompare
является методом экземпляра.
Ответ №1:
Все три версии будут работать:
java.util.Collections.sort(al, (p1, p2)->p1.dob.compareTo(p2.dob));
Является ли лямбда-версией вызова SortTest::diff
java.util.Collections.sort(al, SortTest::diff);
Будет работать, потому что он использует ссылку на статический метод:
public static int diff(Person p1, Person p2){
return p1.dob.compareTo(p2.dob);
}
И
java.util.Collections.sort(al, new MySorter()::compare);
Работает, потому что new MySorter()
создает объект типа MySorter
, а затем ::compare
передает ссылку на метод экземпляра compare
, которая является законной
Ответ №2:
Как возможно создать «новый класс:staticMethod»?
НЕ имеет значения, существует ли экземпляр, компилятор выберет className и вызовет статический метод напрямую.
Источник изображения находится здесь.