我正在浏览this JavaFX tutorial,使用Scala作为实现语言,并遇到了一个问题,我的隐式转换未被提取:
class HelloApplication extends Application {
import HelloApplication._
override def start(stage: Stage) {
stage.setTitle("Hello World!")
val btn = new Button()
btn.setText("Say 'Hello World'")
btn.setOnAction(function2EventHandler(buttonPressed))
val root = new StackPane()
root.getChildren.add(btn)
stage.setScene(new Scene(root, 300, 250))
stage.show()
}
def buttonPressed(ev: ActionEvent) {
println("Hello World!")
}
}
object HelloApplication {
implicit def function2EventHandler[A <: Event](f: A => Unit): EventHandler[A] =
new EventHandler[A] {
override def handle(t: A) = f(t)
}
}
当我更改此行
时btn.setOnAction(function2EventHandler(buttonPressed))
到
btn.setOnAction(buttonPressed)
我收到了编译错误。你能指出我做错了什么吗?
我正在使用JDK 7和Scala 2.11.4附带的JavaFX。
答案 0 :(得分:5)
首先我看到的是:buttonPressed
是方法类型NOT函数类型
def buttonPressed(ev: ActionEvent) {
println("Hello World!")
}
我认为你需要在隐式转换之前使用eta扩展(§6.26.5EtaExpansion ScalaReference):
btn.setOnAction(buttonPressed _)