Scala使用Java库,利用Java 8中的lambda表达式支持
根据:
http://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html#lambda-expressions-in-gui-applications 先前: btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent event) { System.out.println("Hello World!"); } }); 现在我们可以: btn.setOnAction( event -> System.out.println("Hello World!") ); 现在,我在Scala中尝试使用Java库. 我使用JavaFX(默认情况下包含在Java 1.8 SE中). chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") ) 但是,我得到: Error:(204,46) type mismatch; found : javafx.scene.input.MouseEvent => Unit required: javafx.event.EventHandler[_ >: javafx.scene.input.MouseEvent] chart.setOnMouseClicked( (e: MouseEvent) => println("Noice") ) ^ 旧风格工作正常: chart.setOnMouseClicked( new EventHandler[MouseEvent] { override def handle(event: MouseEvent): Unit = println("NOT NOICE") } ) 我在IntelliJ中将项目语言级别设置为Java 8,我正在使用Scala 2.11.1和Java版本为1.8.0_05的Java 我在这里缺少什么?或者根本不可能像上面提到的示例一样将lambda表达式从Scala传递给Java? 解决方法
对于scala版本2.12以上的支持开箱即用.
2.12之前的状态: Lambdas是用java语言介绍的,与scala功能有一点共同之处.它们编译为different bytecode,具有不同的层次结构(scala函数很久以前,显然java设计者已经选择了洁净室实现,而不兼容于scala). 目前的支持是非常有限的,你想做的是不可能的(开箱即用):
有ongoing efforts解决这个问题 参见discussion on scala roadmap to support java 8 functions. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |