btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
System.out.println("Hello World!");
}
});
现在,我们可以:
btn.setOnAction(
event -> System.out.println("Hello World!")
);
现在,我尝试在使用Java库时在Scala中做到这一点。
我正在使用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,而Oracle版本1.8.0_05中的Java
我在这里想念什么?还是根本不可能像上述示例一样将Lambda表达式从Scala传递给Java?
最佳答案
对于scala 2.12版本起,将立即提供支持。
2.12之前的状态:
Lambdas是用Java语言引入的,与scala函数有一些共同之处。它们被编译为different bytecode,具有不同的层次结构(scala函数早在这里,而且显然Java设计人员选择了与scala不兼容的洁净室实现)。
当前支持非常有限,并且您尝试做的事情是不可能的(开箱即用):
Scala 2.11系列针对Java 6,并具有(不断发展的)实验性
支持Java8。在2.11中,Java 8支持主要限于
读取Java 8字节码并解析Java 8源。我们将会
全面扩展Scala(实验性)Java 8支持和互操作
2.11系列。 - 更多信息请访问:
https://typesafe.com/blog/scala-211-has-arrived#sthash.ukr4FSpU.dpuf
有ongoing efforts可以解决此问题
另请参见discussion on scala roadmap to support java 8 functions。
关于scala - 使用Java库的Scala,利用Java 8中的lambda表达式支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24369449/