[英]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.