Osdersky解释的Scala隐式

Osdersky解释的Scala隐式,scala,Scala,我正在读奥德斯基关于Scala隐式的书,我需要一些帮助来理解他的例子。我遇到了这些段落: Java包含一个名为Swing的库,用于实现跨平台用户界面。Swing所做的一件事是处理来自操作系统的事件,将它们转换为独立于平台的事件对象,并将这些事件传递给称为事件侦听器的应用程序的某些部分 如果Swing是在考虑Scala的情况下编写的,那么事件侦听器很可能由函数类型表示 Odersky所说的函数类型是什么意思?通过编写jQuery和Javascript我知道什么是事件监听器,但他将事件监听器表示为函

我正在读奥德斯基关于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的意思是函数不返回任何东西(实际上是单位),所以在这一点上,他是相当正确的。给定此类函数的隐式方法返回一个动作侦听器。