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

时间:2017-11-28 16:31:26

标签: spring-boot kotlin

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

fun main(args: Array<String>) {
   runApplication<MyApplication>(*args)
}

但是无法找到mainClass,而且当我这样做时,IDEA不允许运行应用程序

fun main(args: Array<String>) = runApplication<RankedApplication>(*args)

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

2 个答案:

答案 0 :(得分:5)

runApplication不会返回Unit

main 的签名和返回类型必须

fun main(Array<String>): Unit

runApplicationreturns a ConfigurableApplicationContext

你的&#34;主要&#34;方法相当于:

fun main(args: Array<String>): ConfigurableApplicationContext {
    return runApplication<MyApplication>(*args)
}

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

您的第一种方法有效,因为

fun main(args: Array<String>) {
    runApplication<MyApplication>(*args)
}

相同
fun main(args: Array<String>): Unit {
    runApplication<MyApplication>(*args)
    return Unit
}

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

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

如果您愿意,可以制作一种方法将事物转换为Unit,尽管这可能有点过分。

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

...

fun main(args: Array<String>) = Unit { runApplication<MyApplication>(*args) }

It's the same in Java,这可能是此要求的来源 - 主要方法的签名必须是public static void main(String[])

答案 1 :(得分:2)

fun main(args: Array<String>) {
   runApplication<MyApplication>(*args)
}

main隐含地返回Unit,这是正确的。

这里

fun main(args: Array<String>) = runApplication<RankedApplication>(*args)

从给定表达式推断返回类型为Unit之外的其他内容(因为runApplication返回某些内容),这不起作用,因为main函数必须返回Unit