Sto sviluppando un'applicazione JavaFX8 in Scala ma non sono riuscito a capire come passare un riferimento al metodo su un gestore di eventi. Per chiarire, non sto usando la libreria ScalaFX ma costruisco la mia applicazione direttamente su JavaFX.È possibile utilizzare riferimenti al metodo di stile Java 8 in Scala?
Ecco lo snippet di codice correlato.
InputController.java (ho scritto questa classe di test in Java per isolare il problema di consumare un solo metodo di riferimento)
public class InputController {
public void handleFileSelection(ActionEvent actionEvent){
//event handling code
}
public InputController() {
//init controller
}
}
Questo funziona (Java)
InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);
Questo non funziona (Scala)
val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)
Ecco il messaggio di errore del compilatore (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)
^
Se utilizzo Scala 2.12.0-M2, viene visualizzato un messaggio di errore diverso.
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)
^
C'è un modo nativo con cui Scala può sfruttare i riferimenti ai metodi introdotti in Java 8? Sono a conoscenza dell'approccio implicito delle conversioni all'uso di un'espressione lambda, ma voglio sapere se esiste un modo per utilizzare un riferimento al metodo simile a Java 8 senza la necessità di utilizzare la decodifica lambda.
Nota: Java non ha riferimenti al metodo. Puoi avere un oggetto che ha un metodo che chiama un altro metodo (che è quello che fa realmente lambda) –
Penso di essere confuso con il tuo commento "Java non ha riferimenti al metodo". Ho pensato che quello che sto cercando di fare non è diverso dall'esempio ComparisonProvider nella documentazione ufficiale (link: https://docs.oracle.com/javase/tutorial/java/javaOO/methodreferences.html). – Mustafa
Questa domanda è fondamentalmente un duplicato di http://stackoverflow.com/questions/24369449/ in breve, è possibile creare una conversione implicita da (T) => Unit a EventHandler [T] e importarla implicitamente. –