Разница в том, что вы пытаетесь переопределить реализацию Eucalyptus
, которая является классом, реализующим интерфейс.
Eucalyptus eucalyptus1 = new Eucalyptus();
eucalyptus1.grow(() -> System.out.println("This from Lambda expression"));
^__ // you cannot override a method using an instance of a class which is just an implementation of the interface
Все, что вы в конечном итоге делаете, это передаете лямбда-параметр и, конечно, метод без аргументов в своем определении не будет компилироваться, если будет предоставлен с одним из них во время вызова метода.
Вместо этого вы можете сравнить способ реализации лямбды как:
//Anonymous class Myrtle from Plant interface
Plant myrtle = new Plant() {
@Override
public void grow() {
System.out.println("This was running from anonymous class from Plant Interface");
}
};
myrtle.grow();
может быть представлено как лямбда-представление:
Plant lambdaRep = () -> System.out.println("This is running via lambda from Plant Interface");
lambdaRep.grow();