繁体   English   中英

Scala ActionListener /匿名函数类型不匹配

[英]Scala ActionListener / anonymous function type mismatch

尝试实现类似于http://www.codecommit.com/blog/scala/scala/scala-for-java-refugees-part-6的高阶函数示例中的代码

val button = new JButton("test")
button.addActionListener{ e:ActionEvent => println("test") }
add(button)

导致以下

error: type mismatch;
found   : (java.awt.event.ActionEvent) => Unit 
required: java.awt.event.ActionListener
   button.addActionListener{ e:ActionEvent => println("test") }
                                           ^

至少对于我系统上的Scala编译器版本2.7.6.final而言,这是正确的。 我可以通过显式实现匿名ActionListener的Java风格的方式实现我想要的功能。

button.addActionListener( new ActionListener() {
  def actionPerformed(e:ActionEvent) { println("test") }
})

据我了解,Scala应该可以使用鸭式输入法来使ActionListener的这种显式实现成为不必要。 那为什么在这里不起作用? 在这一点上,我几乎没有鸭嘴式的实践经验。

鸭子输入与您的代码不起作用的原因无关。 这是因为默认情况下,Scala的类型系统不提供接口类型和函数类型之间的隐式转换。 但是,如果定义了以下隐式转换,则您的代码可以正常工作。

implicit def toActionListener(f: ActionEvent => Unit) = new ActionListener {
  def actionPerformed(e: ActionEvent) { f(e) }
}

这种隐式转换提供了从(ActionEvent => Unit)到ActionListner的转换。

Scala不是鸭式的。 它具有可选的显式结构化类型,但这与代码不起作用的原因无关。

您的代码不起作用,因为JButton.addActionListener期望将ActionListener作为其参数,而不是函数。 即使scala是ducktyped,您也不能仅传递函数,因为ActionListener上可用的相同方法对函数不可用。

请注意,文章说:“让我们幸福的一刻,我们可以重写Swing以充分利用Scala的语法”,即文章并未声称向您展示实际的代码。

但是scala确实有它自己的swing软件包( scala.swing ),其中包含的类比其Java等效类要使用的“ scalaish”类更多。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM