Scala暗示Odersky所解释的

时间:2018-05-21 02:06:46

标签: scala

我正在阅读关于Scala暗示的Odersky书,我需要一些帮助来理解他的例子。我偶然发现了这些段落:

  

Java包含一个名为Swing的库,用于实现跨平台用户界面。 Swing所做的一件事是来自操作系统的进程事件,将它们转换为与平台无关的事件对象,并将这些事件传递给一个名为事件监听器的应用程序部分......

     

如果Swing是用Scala编写的,事件监听器可能已经用函数类型表示。

Odersky的功能类型是什么意思?我知道什么事件监听器来自编写jQuery和Javascript,但他将事件监听器表示为函数类型是什么意思?

接下来,他的代码示例对我来说有点不清楚。第一个:

EmployeePictureId

那么这里发生了什么?我们是否使用方法val button = new JButton button.addActionListener( new ActionListener { def actionPerformed(event: ActionEvent) = { println("pressed") } } ) 将对象传递给actionPerformed方法?这里发生了什么?如何使用此ActionListener?

接下来,他减少了Scala友好代码:

addActionListener

我们将匿名函数传递给button.addActionListener( (_: ActionEvent) => println("pressed") ) 方法。如何使用下划线?

最后,

addActionListener

因此,这个隐式接受一个接受implicit def function2ActionListener(f: ActionEvent => Unit) = new ActionListener{ def actionPerformed(event: ActionEvent) = f(event) } 并且不返回任何内容的函数。 ActionEvent在这做什么?它在做什么?它是在实例化对象中创建方法new吗?发生了什么事?

由于这些不是完整的代码示例,我很难看到它们将如何使用以及它们如何结合在一起。关于代码中发生了什么,我也有点迷失...就像是一个定义了方法的新对象? actionPerformed方法是否在新对象中定义?为什么?有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该刷新anonymous inner class的内容,以及如何在以Java为中心的框架中使用它来进行各种回调。

  

Odersky的功能类型是什么意思?

由特征实现的形状类型(X1, ..., Xn) => Y Function1[-X, +Y]Function2[-X1, -X1, +Y]等等(如果我没记错的话,最多22个,除非此限制已被解除)。

  

将事件侦听器表示为函数类型是什么意思?

“事件监听器”只是采用某种Event的特殊类,并执行一些操作,通常返回Unit。这与函数类型Event => Unit基本相同。

  

这里发生了什么?如何使用此ActionListener?

如上所述,我们使用方法actionPerformed实例化一个匿名内部类,并将其作为回调安装在某个GUI元素上。

  

如何使用下划线?

完全没有使用它。 Underscore专门用于未使用的参数。这是因为这个监听器有点愚蠢,每次都会打印出相同的消息,无论事件是什么。

  

因此,这隐式采用一个接受ActionEvent并且不返回任何内容的函数。

实现ActionListener的匿名内部类的实例需要函数f来实现方法actionPerformed,并且从其签名中您可以看到它需要Unit as返回类型,因为它只是在收到Event时执行一些副作用操作,并且不需要返回任何有意义的值。

顺便说一句:由于SAM(单一抽象方法语法糖),这最后的隐式转换现在已经过时了。

相关问题