Osdersky解释的Scala隐式
我正在读奥德斯基关于Scala隐式的书,我需要一些帮助来理解他的例子。我遇到了这些段落: Java包含一个名为Swing的库,用于实现跨平台用户界面。Swing所做的一件事是处理来自操作系统的事件,将它们转换为独立于平台的事件对象,并将这些事件传递给称为事件侦听器的应用程序的某些部分 如果Swing是在考虑Scala的情况下编写的,那么事件侦听器很可能由函数类型表示 Odersky所说的函数类型是什么意思?通过编写jQuery和Javascript我知道什么是事件监听器,但他将事件监听器表示为函数类型是什么意思 接下来,他的代码示例对我来说有点不清楚。第一个:Osdersky解释的Scala隐式,scala,Scala,我正在读奥德斯基关于Scala隐式的书,我需要一些帮助来理解他的例子。我遇到了这些段落: 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
函数,但不返回任何内容。新的在这里做什么?它在干什么?是否在实例化对象内创建方法actionPerformed
?发生了什么事
由于这些都不是完整的代码示例,我很难看到它们是如何使用的,以及它们是如何结合在一起的。我也有点不知道代码中发生了什么。。。像是定义了方法的新对象?是否在新对象中定义了
操作执行
方法?为什么?有人能帮点忙吗?首先,您可能应该更新an是什么,以及它在以Java为中心的框架中如何用于各种回调
Odersky所说的函数类型是什么意思
由特征实现的形状类型(X1,…,Xn)=>Y
,等等(如果我没记错的话,最多22个,除非这个限制现在已经取消)
他将事件侦听器表示为函数类型是什么意思
“事件侦听器”只是一些特殊的类,它们执行某种类型的事件
,并执行一些操作,通常返回单元
。这与函数类型Event=>Unit
基本相同
这是怎么回事?如何使用这个ActionListener
如前所述,我们正在使用方法actionPerformed
实例化一个匿名内部类,并将其作为回调安装在某个GUI元素上
如何使用下划线
它根本不用。下划线专门用于未使用的参数。这是因为这个监听器有点笨,不管事件是什么,每次都会打印出相同的消息
因此,这个隐式函数接受一个ActionEvent
函数,但不返回任何内容
实现ActionListener
的匿名内部类的实例需要函数f
来实现方法actionPerformed
,从它的签名可以看出,它需要Unit
作为返回类型,因为它在接收到事件时只执行一些副作用操作,并且不需要返回任何有意义的值
顺便说一句:由于SAM(单一抽象方法语法糖),最后的隐式转换现在大部分已经过时了。关于最后一点,我猜OP的意思是函数不返回任何东西(实际上是单位),所以在这一点上,他是相当正确的。给定此类函数的隐式方法返回一个动作侦听器。