Почему не работает первый из следующих примеров?
-
run(R::new);
МетодR.run
не вызывается. -
run(new R());
МетодR.run
называется.
Оба примера скомпилированы.
public class ConstructorRefVsNew {
public static void main(String[] args) {
new ConstructorRefVsNew().run(R::new);
System.out.println("-----------------------");
new ConstructorRefVsNew().run(new R());
}
void run(Runnable r) {
r.run();
}
static class R implements Runnable {
R() {
System.out.println("R constructor runs");
}
@Override
public void run() {
System.out.println("R.run runs");
}
}
}
Выход:
R constructor runs
-----------------------
R constructor runs
R.run runs
В первом примере вызывается конструктор R
, он возвращает лямбду (которая не является объектом):
Но тогда как это возможно, что пример успешно скомпилирован?