Именно так и используются лямбда-выражения и ссылки на методы: назначая их для функционального интерфейса , интерфейса с одним абстрактным методом. В противном случае они не компилируются.
Если бы вы проверили 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()
.)