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

got*_*ch4 7 scala

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

def delayedInit(body: ? Unit): Unit

val executionStart: Long

def main(args: Array[String]): Unit
Run Code Online (Sandbox Code Playgroud)

我知道如果一个特征只有一个方法,通过在类声明中的花括号之间"放置代码",我将覆盖它.但在这里我有两种方法.那么为什么我自动覆盖主要而不是延迟?

sen*_*nia 11

你不是最重要的main方法.

由于Appextends DelayedInit编译器重写您的代码,如下所示:

// Before:
object Test extends App {
  println("test")
}

// After:
object Test extends App {
  delayedInit{println("test")}
}
Run Code Online (Sandbox Code Playgroud)

来自DelayedInit 文档:

继承DelayedInit标记特征的类和对象(但注意,而不是特征) 将按如下方式重写其初始化代码:code变为delayedInit(code).

App特征实现 delayedInit如下:

override def delayedInit(body: => Unit) {
  initCode += (() => body)
}
Run Code Online (Sandbox Code Playgroud)

因此在Test对象构造函数中,代码println("test")存储为字段中的function(() => Unit)initCode.

main方法App实现为对initCode字段中存储的所有函数的调用:

for (proc <- initCode) proc()
Run Code Online (Sandbox Code Playgroud)