为什么如果我在Scala中扩展App特性,我会覆盖main方法?

时间:2013-11-06 09:50:38

标签: scala

所以我读到App trait有以下字段:

def delayedInit(body: ⇒ Unit): Unit

val executionStart: Long

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

我知道如果一个特征只有一个方法,通过在类声明中的花括号之间“放置代码”我会覆盖它。但在这里我有两种方法。那么为什么我自动覆盖main而不是delayedInit?

1 个答案:

答案 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