7

そのため、 App トレイトには次のフィールドがあることを読みました。

def delayedInit(body: ⇒ Unit): Unit

val executionStart: Long

def main(args: Array[String]): Unit

トレイトにメソッドが 1 つしかない場合は、クラス宣言の中括弧の間に「コードを配置」することで、それをオーバーライドしていることを知っています。しかし、ここでは2つの方法があります。では、なぜ自動的に main をオーバーライドし、delayedInit をオーバーライドしないのでしょうか?

4

1 に答える 1

11

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()
于 2013-11-06T10:07:15.333 に答える