所以我读到 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
初始化代码将重写如下:code
delayedInit(code)
App
trait实现 delayedInit
如下:
override def delayedInit(body: => Unit) {
initCode += (() => body)
}
因此,在Test
对象构造函数中,代码println("test")
作为函数 ( () => Unit
) 存储在initCode
字段中。
main
的方法App
被实现为对存储在initCode
字段中的所有函数的调用:
for (proc <- initCode) proc()