Ist es möglich, in Scala Methodenreferenzen im Java 8-Stil zu verwenden?
Ich entwickle eine JavaFX8-Anwendung in Scala, konnte jedoch nicht herausfinden, wie eine Methodenreferenz an einen Ereignishandler übergeben wird. Zur Verdeutlichung verwende ich keine ScalaFX-Bibliothek, sondern erstelle meine Anwendung direkt über JavaFX.
Hier ist das zugehörige Code-Snippet.
InputController.java (Ich habe diese Testklasse in Java geschrieben, um das Problem zu isolieren und nur eine Methodenreferenz zu verwenden.)
public class InputController {
public void handleFileSelection(ActionEvent actionEvent){
//event handling code
}
public InputController() {
//init controller
}
}
Dies funktioniert (Java)
InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);
Dies funktioniert nicht (Scala)
val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)
Hier ist die Fehlermeldung des Compilers (Scala 2.11.6).
Error:(125, 45) missing arguments for method handleFileSelection in class Main;
follow this method with '_' if you want to treat it as a partially applied function
fileButton.setOnAction(inputController::handleFileSelection)
^
Wenn ich stattdessen Scala 2.12.0-M2 verwende, wird eine andere Fehlermeldung angezeigt.
Error:(125, 45) missing argument list for method handleFileSelection in class Main
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `handleFileSelection _` or `handleFileSelection(_)` instead of `handleFileSelection`.
fileButton.setOnAction(inputController::handleFileSelection)
^
Gibt es eine native Methode, mit der Scala die in Java 8 eingeführten Methodenreferenzen nutzen kann? Ich kenne den impliziten Konvertierungsansatz für die Verwendung eines Lambda-Ausdrucks, möchte aber wissen, ob es eine Möglichkeit gibt, eine Java 8-ähnliche Methodenreferenz zu verwenden, ohne die Lambda-Dekleration verwenden zu müssen.