scala编译中的原因(self:Runnable =>)?

时间:2014-09-10 08:09:33

标签: function scala

/** A marker indicating that a `java.lang.Runnable` provided to `scala.concurrent.ExecutionContext`
 * wraps a callback provided to `Future.onComplete`.
 * All callbacks provided to a `Future` end up going through `onComplete`, so this allows an
 * `ExecutionContext` to special-case callbacks that were executed by `Future` if desired.
 */
trait OnCompleteRunnable {
  self: Runnable =>
}

当我在scala中检查Future的源代码时,我无法理解为什么self:Runnable =>以上编译。 我知道符号=>可以在方法参数中用作名称调用,也可以用于定义函数。上面的代码似乎定义了一个函数,但它让我很困惑。

1 个答案:

答案 0 :(得分:11)

此语法表示explicitly typed self reference。它实质上意味着扩展OnCompleteRunnable的任何内容也必须扩展Runnable

您可能想知道这与普通继承有何不同:

trait OnCompleteRunnable extends Runnable

简而言之,不同之处在于自键型引用只是一种类型约束。它不会建立子类型关系,因此OnCompleteRunnable无法实现或覆盖Runnable中的任何内容。所以它就像一种较弱的继承形式。