7

所以我读到 App trait 有以下字段:

def delayedInit(body: ⇒ Unit): Unit

val executionStart: Long

def main(args: Array[String]): Unit

我知道如果一个特征只有一种方法,通过在类声明中的花括号之间“放置代码”,我将覆盖它。但在这里我有两种方法。那么为什么我要自动覆盖 main 而不是 delayInit 呢?

4

1 回答 1

11

你不是压倒一切的main方法。

由于App扩展DelayedInit编译器会像这样重写您的代码:

// Before:
object Test extends App {
  println("test")
}

// After:
object Test extends App {
  delayedInit{println("test")}
}

DelayedInit 文档

继承标记特征的类和对象(但注意,不是特征) 的DelayedInit初始化代码将重写如下:codedelayedInit(code)

Apptrait实现 delayedInit如下:

override def delayedInit(body: => Unit) {
  initCode += (() => body)
}

因此,在Test对象构造函数中,代码println("test")作为函数 ( () => Unit) 存储在initCode字段中。

main的方法App被实现为对存储在initCode字段中的所有函数的调用:

for (proc <- initCode) proc()
于 2013-11-06T10:07:15.333 回答