kotlin springboot应用程序 - 为什么没有表达体的功能?

Jan*_*ski 1 kotlin spring-boot

在我的(2.0.0.M6)kotlin-spring启动应用程序中,当我这样做时,一切正常

fun main(args: Array<String>) {
   runApplication<MyApplication>(*args)
}
Run Code Online (Sandbox Code Playgroud)

但是找不到mainClass,IDEA不允许在我这样做时运行应用程序

fun main(args: Array<String>) = runApplication<RankedApplication>(*args)
Run Code Online (Sandbox Code Playgroud)

这根本不重要,但我想知道:为什么?

Moi*_*ira 5

runApplication不回来Unit.

签名和返回类型main 必须完全符合:

fun main(Array<String>): Unit
Run Code Online (Sandbox Code Playgroud)

runApplication但是,返回一个ConfigurableApplicationContext.

你的"主要"方法相当于:

fun main(args: Array<String>): ConfigurableApplicationContext {
    return runApplication<MyApplication>(*args)
}
Run Code Online (Sandbox Code Playgroud)

因为返回类型是从表达式推导出来的 - 你可以看到这不是一个有效的入口点.

你的第一种方法有效

fun main(args: Array<String>) {
    runApplication<MyApplication>(*args)
}
Run Code Online (Sandbox Code Playgroud)

是相同的

fun main(args: Array<String>): Unit {
    runApplication<MyApplication>(*args)
    return Unit
}
Run Code Online (Sandbox Code Playgroud)

因为Unit(单个对象)是指定none时的默认返回类型,并且在声明为return的方法的末尾隐式返回Unit.

这也是return没有参数有效的原因 - 它只是返回Unit.


如果你愿意,你可以制作一个方法来转换东西,Unit虽然这可能是过度的.

inline fun Unit(lambda: () -> Any?) {
    lambda()
}

...

fun main(args: Array<String>) = Unit { runApplication<MyApplication>(*args) }
Run Code Online (Sandbox Code Playgroud)

在Java中也是如此,这可能是这个要求的来源 - 主要方法的签名必须是public static void main(String[]).