Scala单方法接口(interface)实现

标签 scala interface lambda syntactic-sugar traits

Scala 是否有任何语法糖来替换以下代码:

val thread = new Thread(new Runnable {
   def run() {
     println("hello world")
   }    
})

更像是:
val thread = new Thread(() => println("hello world"))

在特征/接口(interface)只需要实现一种方法的情况下?如果没有,将来是否有机会在 Scala 中拥有此功能?它在处理 Java 类时特别有用。

我发现三年前问过一个类似的问题:Generically implementing a Java Single-Abstract-Method interface with a Scala closure?答案说我们应该在 Scala 2.10 中拥有该功能。我一直在寻找 Single Abstract Method 关键字,但我没有找到任何东西。该功能发生了什么?

最佳答案

斯卡拉有 实验 支持从 2.11 开始的 SAM,标记为 -Xexperimental :

Welcome to Scala version 2.11.0-RC3 (OpenJDK 64-Bit Server VM, Java 1.7.0_51).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :set -Xexperimental

scala> val r: Runnable = () => println("hello world")
r: Runnable = $anonfun$1@7861ff33

scala> new Thread(r).run
hello world

编辑 :从 2.11.5 开始,这也可以内联完成:
scala> new Thread(() => println("hello world")).run
hello world

预期类型的​​通常限制也适用:
  • 它必须定义一个抽象方法,
  • 其主构造函数(如果有)必须是公共(public)的、无参数的、未重载的、
  • 抽象方法必须采用单个参数列表,
  • 抽象方法必须是单态的。

  • 根据original commit根据 Adriaan 的说法,其中一些限制可能会在 future 取消,尤其是最后两个。

    关于Scala单方法接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22820352/

    相关文章:

    python - 在 python 中,如何根据键(相邻组)将元素组合在一起?

    scala - 在 Scala 中使用元组作为键

    java - 使用 settings.xml 解决 sbt 的 java Artifact

    scala - Scala的 'NotInferedT'来自哪里?

    com - 如何列出所有 ActiveX 控件?

    c# - 使用 lambda 运算符创建斐波那契数列

    scala - 加载的 html 从父目录请求静态内容

    interface - Go 接口(interface)是 (type, nil) 或 (type , value)

    javascript - typescript :使用预先存在的标识符覆盖/扩展 Lib.d.ts

    使用 lambda 和 std::function 的 C++11 类型推断