【问题标题】:kotlin springboot application - why no function with expression body?kotlin spring boot 应用程序 - 为什么没有表达式主体的功能?
【发布时间】:2017-11-28 16:31:26
【问题描述】:

在我的 (2.0.0.M6) kotlin-spring boot 应用程序中,一切正常

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

但是找不到 mainClass 并且当我这样做时 IDEA 不允许运行该应用程序

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

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

【问题讨论】:

    标签: spring-boot kotlin


    【解决方案1】:

    runApplication 不返回 Unit。

    main的签名和返回类型必须准确:

    fun main(Array<String>): Unit
    

    runApplication,不过,returns a ConfigurableApplicationContext。

    你的“main”方法相当于:

    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(单例对象)是未指定时的默认返回类型,并且在声明为返回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[])。

    【讨论】:

      【解决方案2】:
      fun main(args: Array<String>) {
         runApplication<MyApplication>(*args)
      }
      

      main 在这里隐式返回Unit 这是正确的。

      这里

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

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

      【讨论】:

        猜你喜欢
        • 2023-02-10
        • 1970-01-01
        • 2018-01-15
        • 1970-01-01
        • 2022-10-23
        • 2016-03-18
        • 2018-09-04
        • 2020-09-24
        • 1970-01-01
        相关资源
        最近更新 更多