[英]Scala implicits as explained by Odersky
我正在阅读有关Scala隐式内容的Odersky书,我需要一些帮助来理解他的示例。 我遇到这些段落:
Java包含一个名为Swing的库,用于实现跨平台的用户界面。 Swing要做的一件事是处理来自操作系统的事件,将其转换为与平台无关的事件对象,并将这些事件传递到应用程序的称为事件侦听器的部分。
如果在编写Swing时考虑到了Scala,则事件侦听器可能由函数类型表示。
Odersky按功能类型表示什么? 我知道编写jQuery和Javascript是什么事件监听器,但是通过将事件监听器表示为函数类型,他是什么意思呢?
接下来,他的代码示例对我来说还不清楚。 第一个:
val button = new JButton
button.addActionListener(
new ActionListener {
def actionPerformed(event: ActionEvent) = {
println("pressed")
}
}
)
那么这是怎么回事? 我们是否将带有actionPerformed
方法的对象传递给addActionListener
方法? 这里发生了什么? 一个人将如何使用此ActionListener?
接下来,他简化的Scala友好代码是这样的:
button.addActionListener(
(_: ActionEvent) => println("pressed")
)
我们正在将匿名函数传递给addActionListener
方法。 下划线将如何使用?
最后,
implicit def function2ActionListener(f: ActionEvent => Unit) =
new ActionListener{
def actionPerformed(event: ActionEvent) = f(event)
}
因此,此隐式函数采用一个接受ActionEvent
返回任何内容的函数。 new
在这里做什么? 到底在做什么 它是否在实例化对象内部创建了一个actionPerformed
方法? 到底是怎么回事?
由于这些不是完整的代码示例,因此我很难看到它们将如何使用以及如何组合在一起。 对于代码中发生的事情,我也有些迷茫……就像定义了方法的新对象一样? 是否在新对象中定义了actionPerformed
方法? 为什么? 有人可以帮忙吗?
首先,您可能应该刷新什么是匿名内部类 ,以及如何在以Java为中心的框架中将其用于各种回调。
Odersky按功能类型表示什么?
形状(X1, ..., Xn) => Y
,由特征Function1[-X, +Y]
, Function2[-X1, -X1, +Y]
等实现(如果记得,最多22种)除非目前已取消此限制)。
通过将事件侦听器表示为函数类型是什么意思?
“事件监听器”只是特殊的类,它们采用某种Event
并执行某些操作,通常返回Unit
。 这基本上与功能类型Event => Unit
。
这里发生了什么? 一个人将如何使用此ActionListener?
如前所述,我们正在使用actionPerformed
方法实例化一个匿名内部类,并将其作为回调安装在某些GUI元素上。
下划线将如何使用?
根本不使用它。 下划线专门用于不使用的参数。 这是因为该侦听器有点笨,并且每次都仅打印出相同的消息,而不管事件是什么。
因此,此隐式函数采用一个接受
ActionEvent
返回任何内容的函数。
实现ActionListener
的匿名内部类的实例需要函数f
来实现actionPerformed
方法,从其签名中您可以看到它需要Unit
作为返回类型,因为它在收到Event
时仅执行一些副作用操作,并且不需要返回任何有意义的值。
顺便说一句:由于SAM(单个抽象方法语法糖),最后一次隐式转换现在已过时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.