Почему ссылку на метод можно вставить в список интерфейсов в Java? - PullRequest
0 голосов
/ 09 ноября 2019

Я не понимаю, почему этот код компилируется без ошибок или предупреждений:

import java.util.ArrayList;
import java.util.List;

class A {}

interface I {
    void methodI();
}

public class B {
    public void test() {
        List<I> l = new ArrayList<>();
        l.add(A::new);
    }
}

В конце концов, A::new должно быть лямбда-выражением (как показано при печати l.get (0), который даетB$$Lambda$/1/...), поэтому я не понимаю, почему он может поместиться в списке интерфейса I. (Я использую Java 8, но также протестирован с Java 10 )

1 Ответ

3 голосов
/ 09 ноября 2019

Именно так и используются лямбда-выражения и ссылки на методы: назначая их для функционального интерфейса , интерфейса с одним абстрактным методом. В противном случае они не компилируются.

Если бы вы проверили B$$Lambda$/1/..., то обнаружили бы, что это автоматически сгенерированный класс, который implements I.

Все эти фрагменты эквивалентны:

l.add(A::new);
l.add(() -> new A());
l.add(() -> { new A(); });
l.add(new I() {
    @Override public void methodI() {
        new A();
    }
});

(Обратите внимание, что это не полезный метод. Он создает новый объект и сразу же выбрасывает его. A::new является допустимымсоответствует void methodI(), но это, скорее всего, семантическая ошибка. Было бы лучше, если бы интерфейс был что-то вроде A methodI() или Object methodI().)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...