加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

可以在Scala中使用Java 8风格的方法引用吗?

发布时间:2020-12-16 09:11:20 所属栏目:安全 来源:网络整理
导读:我正在 Scala开发一个 JavaFX8应用程序,但我无法弄清楚如何传递方法引用到事件处理程序.为了澄清,我没有使用ScalaFX库,而是直接在JavaFX之上构建我的应用程序. 以下是相关的代码段. InputController.java(我在Java中写了这个测试类,以将问题隔离,仅消耗方法
我正在 Scala开发一个 JavaFX8应用程序,但我无法弄清楚如何传递方法引用到事件处理程序.为了澄清,我没有使用ScalaFX库,而是直接在JavaFX之上构建我的应用程序.

以下是相关的代码段.

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.

解决方法

inputController :: handleFileSelection是Java语法,它不支持或需要在Scala中,因为它已经有一个简短的语法lambdas像这样:inputController.handleFileSelection _或inputController.handleFileSelection(_)(inputController.handleFileSelection也可以工作,取决于上下文).

但是,在Java中,可以使用任何SAM(单抽象方法)接口,而EventHandler就是这样一个接口,可以使用lambdas和方法引用.在2.11之前的Scala中,这是不允许的,在2.11中有实验支持使用带有SAM接口的lambdas,必须使用-Xexperimental scalac标志启用,并从2.12开始,它完全支持,不需要启用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读