Метод Java 8 Подпись различных версий одного и того же метода - PullRequest
0 голосов
/ 02 мая 2018

Версия 1

interface HelloWorld{
    String hello(String s);
}
HelloWorld h = String::new;
h.hello("Something");

Версия 2

interface HelloWorld{
    void hello(String s);
}
HelloWorld h = String::new;
h.hello("Something");

Версия 3

interface HelloWorld{
    String hello();
}
HelloWorld h = String::new;
h.hello();

Версия 4

 interface HelloWorld{
     void hello();
 }
 HelloWorld h = String::new;
 h.hello();

Я создал четыре версии одного и того же кода, но я не изменил HelloWorld h = String::new; В первом случае, который я могу понять, он создает новый объект типа String со значением, переданным в аргументе, и возвращает объект.

Может ли кто-нибудь это уточнить, почему компилятор не дает никаких ошибок в других случаях с некоторым объяснением?

1 Ответ

0 голосов
/ 02 мая 2018

В Версии 1 и Версии 2 ваша ссылка на метод String::new ссылается на конструктор public String(String original) класса String.

В Версии 3 и Версии 4 ссылка на метод String::new ссылается на конструктор public String() класса String.

Не имеет значения, возвращает ли метод вашего функционального интерфейса String или имеет тип возврата void. В любом случае соответствующая ссылка на метод String::new соответствует сигнатуре метода вашего интерфейса.

Возможно, написание Java 7 эквивалентов облегчит это понимание:

Версия 1:

HelloWorld h = new HelloWorld () {
    String getSomething(String s) {
        return new String(s);
    }
}

Версия 2:

HelloWorld h = new HelloWorld () {
    void getSomething(String s) {
        new String(s);
    }
}

Версия 3:

HelloWorld h = new HelloWorld () {
    String getSomething() {
        return new String();
    }
}

Версия 4:

HelloWorld h = new HelloWorld () {
    void getSomething() {
        new String();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...