Синтаксис лямбды в 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);
}