【发布时间】:2015-11-02 20:04:18
【问题描述】:
我正在使用 Scala 开发 JavaFX8 应用程序,但我不知道如何将方法引用传递给事件处理程序。澄清一下,我没有使用 ScalaFX 库,而是直接在 JavaFX 之上构建我的应用程序。
这里是相关代码sn-p。
InputController.java(我用 Java 编写了这个测试类来隔离问题,只使用方法引用)
public class InputController {
public void handleFileSelection(ActionEvent actionEvent){
//event handling code
}
public InputController() {
//init controller
}
}
这行得通(Java)
InputController inputController = new InputController();
fileButton.setOnAction(inputController::handleFileSelection);
这不起作用(Scala)
val inputController = new InputController
fileButton.setOnAction(inputController::handleFileSelection)
这是来自编译器 (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)
^
如果我改用 Scala 2.12.0-M2,我会收到不同的错误消息。
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)
^
Scala 是否有一种本地方式可以利用 Java 8 中引入的方法引用?我知道使用 lambda 表达式的隐式转换方法,但我想知道是否有一种方法可以使用类似于 Java 8 的方法引用,而无需使用 lambda decleration。
【问题讨论】:
-
注意:Java 没有方法引用。你可以有一个对象,它有一个调用另一个方法的方法(这是 lambdas 实际做的)
-
我想我对您的评论“Java 没有方法引用”感到困惑。我认为我要做的与官方文档中的 ComparisonProvider 示例没有什么不同(链接:docs.oracle.com/javase/tutorial/java/javaOO/…)。
-
这个问题基本上是stackoverflow.com/questions/24369449 的副本,简而言之,您可以创建一个从 (T) => Unit 到 EventHandler[T] 的隐式转换并导入该隐式。
-
@angelogenovese 我知道这个问题,但是,我想知道是否可以同时使用方法引用来避免 lambda 语法。我已经编辑了我的问题以反映这一点。
-
ScalaFX 是一个开源项目。有原因阻止您使用它,但没有查看代码以获取使用示例
标签: java scala java-8 javafx-8