函数类型的隐式转换

时间:2015-03-23 18:43:28

标签: scala

我正在浏览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。

1 个答案:

答案 0 :(得分:5)

首先我看到的是:buttonPressed是方法类型NOT函数类型

的表达式
def buttonPressed(ev: ActionEvent) {
    println("Hello World!")
}

我认为你需要在隐式转换之前使用eta扩展(§6.26.5EtaExpansion ScalaReference):

btn.setOnAction(buttonPressed _)