所以我读到App trait有以下字段:
def delayedInit(body: ⇒ Unit): Unit
val executionStart: Long
def main(args: Array[String]): Unit
我知道如果一个特征只有一个方法,通过在类声明中的花括号之间“放置代码”我会覆盖它。但在这里我有两种方法。那么为什么我自动覆盖main而不是delayedInit?
答案 0 :(得分:11)
您没有覆盖main
方法。
由于App
扩展DelayedInit
编译器会重写代码,如下所示:
// Before:
object Test extends App {
println("test")
}
// After:
object Test extends App {
delayedInit{println("test")}
}
来自DelayedInit
documentation:
继承的类和对象(但注意,而不是特征)
DelayedInit
标记特征将具有其初始化代码 重写如下:code
变为delayedInit(code)
。
App
特质implements delayedInit
是这样的:
override def delayedInit(body: => Unit) {
initCode += (() => body)
}
因此,Test
对象构造函数代码println("test")
在() => Unit
字段中存储为函数(initCode
)。
main
的{{1}}方法被实现为对App
字段中存储的所有函数的调用:
initCode