繁体   English   中英

Odersky解释的Scala隐式

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM