所以我读到 App trait 有以下字段:
def delayedInit(body: ⇒ Unit): Unit
val executionStart: Long
def main(args: Array[String]): Unit
我知道如果一个特征只有一种方法,通过在类声明中的花括号之间“放置代码”,我将覆盖它。但在这里我有两种方法。那么为什么我要自动覆盖 main 而不是 delayInit 呢?
所以我读到 App trait 有以下字段:
def delayedInit(body: ⇒ Unit): Unit
val executionStart: Long
def main(args: Array[String]): Unit
我知道如果一个特征只有一种方法,通过在类声明中的花括号之间“放置代码”,我将覆盖它。但在这里我有两种方法。那么为什么我要自动覆盖 main 而不是 delayInit 呢?
你不是压倒一切的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()