mainメソッドをオーバーライドしていません。
AppextendsDelayedInitコンパイラはコードを次のように書き換えます。
// Before:
object Test extends App {
println("test")
}
// After:
object Test extends App {
delayedInit{println("test")}
}
DelayedInit ドキュメントから:
マーカー トレイトを継承するクラスとオブジェクト (ただし、トレイトではないことに注意)
DelayedInitは、初期化コードが次のように書き換えられcodeますdelayedInit(code)。
Appトレイトは次のように実装 delayedInitします:
override def delayedInit(body: => Unit) {
initCode += (() => body)
}
そのため、Testオブジェクト コンストラクター コードprintln("test")は関数 ( () => Unit) としてinitCodeフィールドに格納されます。
mainのメソッドは、フィールドAppに格納されているすべての関数の呼び出しとして実装されています。initCode
for (proc <- initCode) proc()