Scala单方法接口实现

Meq*_*rel 19 lambda scala interface syntactic-sugar traits

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

val thread = new Thread(new Runnable {
   def run() {
     println("hello world")
   }    
})
Run Code Online (Sandbox Code Playgroud)

更喜欢的东西:

val thread = new Thread(() => println("hello world"))
Run Code Online (Sandbox Code Playgroud)

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

我在三年前发现了类似的问题:通常使用Scala闭包实现Java Single-Abstract-Method接口?答案说我们应该在Scala 2.10中使用该功能.我找了单一抽象方法关键字,但我没有找到任何东西.这个功能发生了什么?

gou*_*ama 20

在标志下,Scala 从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
Run Code Online (Sandbox Code Playgroud)

编辑:从2.11.5开始,这也可以内联完成:

scala> new Thread(() => println("hello world")).run
hello world
Run Code Online (Sandbox Code Playgroud)

关于预期类型的​​通常限制也适用:

  • 它必须定义一个抽象方法,
  • 它的主要构造函数(如果有的话)必须是public,no-args,not overloaded,
  • 抽象方法必须采用单个参数列表,
  • 抽象方法必须是单形的.

根据Adriaan 最初的承诺,未来可能会取消其中一些限制,特别是最后两个.

  • 请注意,问题已修复. (4认同)