main
メソッドをオーバーライドしていません。
App
extendsDelayedInit
コンパイラはコードを次のように書き換えます。
// 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()