ссылка на метод: положение нового

#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:

  1. java.util.Collections.sort(al, (p1, p2)->p1.dob.compareTo(p2.dob));
  2. java.util.Collections.sort(al, SortTest::diff);
  3. 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 и вызовет статический метод напрямую.

введите описание изображения здесь

Источник изображения находится здесь.