【问题标题】:Why Kotlin main vararg args: String cannot be directly passed to SpringBoot's runApplication?为什么 Kotlin main vararg args: String 不能直接传递给 SpringBoot 的 runApplication?
【发布时间】:2020-10-08 09:58:53
【问题描述】:

我想检查在启动 SpringBoot 应用程序时是否可以避免使用扩展运算符。

所以,而不是通常的:

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

这是我尝试过的:

fun main(vararg args: String) {
    runApplication<Application>(args)
}

但我发现这行不通。我收到一条错误消息,告诉我 runApplication 需要 String,但它找到了 Array&lt;out String&gt;。并建议我使用 *args,这正是我试图避免的。

这对我来说毫无意义,因为args 实际上是一个可变参数类型,而不仅仅是一个字符串。而且通过查看 SpringBoot 的 runApplication 的定义,我看到了:

public inline fun <reified T : kotlin.Any> runApplication(vararg args: kotlin.String): org.springframework.context.ConfigurableApplicationContext { /* compiled code */ }

反编译的是:

public static final ConfigurableApplicationContext runApplication(@NotNull String... args) {...}

我假设 vararg args: String 等同于 Java 的 String...

有人对此有解释吗?提前致谢!

【问题讨论】:

    标签: spring-boot kotlin


    【解决方案1】:

    documentation 提供了这个例子:

    fun <T> asList(vararg ts: T): List<T> {
        val result = ArrayList<T>()
        for (t in ts) // ts is an Array
            result.add(t)
        return result
    }
    

    并声明:

    在函数内部,类型为 T 的可变参数作为 T 数组可见,即上例中的 ts 变量的类型为 Array

    从这里我们可以看到,一个可变参数在接收它的函数内部被转换为一个数组。因此,您只能通过使用 * 扩展它来将其传播到 runApplication

    你也说过:

    我假设 vararg args: String 等价于 Java 的 String...

    你猜对了,它是等价的,但这并不意味着它是相同的。

    Kotlin 这样做是为了解决 Java 造成的歧义。例如,如果您有一个Object... 参数,并且您将一个Array&lt;Fizz&gt; 类型的数组传递给它。编译器应该将其读取为Array&lt;Fizz&gt; 类型的单个对象还是Fizz 类型的多个参数?

    在 Kotlin 中,您可以通过给出(或不给出)展开运算符 * 来区分这两种情况

    【讨论】:

      【解决方案2】:
      fun main(vararg args: String) {
          println(args::class.java)
          runApplication<Application>(*args)
      }
      

      打印: class [Ljava.lang.String;

      java数组之类的接缝不能传给kotlin的vararg

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 2014-02-22
        • 2010-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多