Синтаксис лямбды в Java 8

Я столкнулся с проблемой, когда разрешенный синтаксис лямбды изменился между версиями java-компилятора 1.8.0_05 и 1.8.0_20 (бета).

Пример:

package scratch;

import javafx.scene.control.MenuItem;

public class Test
{
    public void test()
    {
        MenuItem mi = new MenuItem();

        //This compiles anywhere
        mi.setOnAction(e -> System.out.println("hi"));

        //as does this
        mi.setOnAction(e -> {System.out.println("hi");});

        //This doesn't on build 1.8.0_20-ea-b13 - but does on build 1.8.0_05-b13
        mi.setOnAction(e -> (System.out.println("hi")));
    }
}

Что я хотел бы знать - является ли последний пример допустимым лямбда-выражением? И они только что подтянули проверку компилятора? Или в последнем 1.8 компиляторе есть ошибка?

Ошибка, напечатанная последним компилятором:

/scratch/src/scratch/Test.java:18: error: method setOnAction in class MenuItem cannot be applied to given types;
                mi.setOnAction(e -> (System.out.println("hi")));
                  ^
  required: EventHandler<ActionEvent>
  found: (e)->(Syst[...]hi"))
 reason: argument mismatch; bad return type in lambda expression
      missing return value
1 error

Изменить (так как я не могу отформатировать комментарии в ответах):

Реализация метода setOnAction:

public final void setOnAction(EventHandler<ActionEvent> value) {
    onActionProperty().set( value);
}

И EventHandler:

@FunctionalInterface
public interface EventHandler<T extends Event> extends EventListener {
    /**
     * Invoked when a specific event of the type for which this handler is
     * registered happens.
     *
     * @param event the event which occurred
     */
    void handle(T event);
}

Ответы на вопрос(1)

Ваш ответ на вопрос