【问题标题】:How to pass vararg as array to function in Kotlin?如何将 vararg 作为数组传递给 Kotlin 中的函数?
【发布时间】:2021-04-08 15:00:25
【问题描述】:

我想将 vararg 从 buy 函数传递给 drive 函数 但我明白了

编译错误:

required Array<T> found Array<out T>

代码:

class Car

fun buy(vararg cars: Car) {
    drive(cars) //compile error
}

fun drive(cars: Array<Car>) {
    //...
}

【问题讨论】:

    标签: kotlin variadic-functions


    【解决方案1】:

    准确的错误是:

    Type mismatch.
    Required: Array<Car>
    Found:    Array<out Car>
    

    问题在于,当你有一个vararg cars: Car 函数参数时,它在函数内部的类型是Array&lt;out Car&gt;,它基本上代表了一个只读数组,其中包含调用函数的参数 - 毕竟,它不会开始修改你作为vararg 获得的参数真的是一件好事(Kotlin 中的函数参数是只读的vals,这非常相似)。

    但是你的drive 函数需要一个普通的Array&lt;Car&gt;,当然它也是可写的。因此,如果您希望保留这些函数签名,则需要创建一个新数组,其中包含只读数组中的所有内容。这可以使用以下语法创建:

    drive(arrayOf(*cars))
    

    这会调用我们通常用来创建数组的arrayOf 函数,该函数接受一个可变参数,并使用扩展运算符,这是一种传入数组元素的方法(cars 在@987654332 内部@function) 作为可变参数 (docs here)。

    虽然这一切听起来很复杂,但它实际上是一个非常有效的解决方案,因为它只是在字节码的底层使用了Array.copyOf

    【讨论】:

    • 我认为另一个答案更典型,你会喜欢Array&lt;out Car&gt;作为第二个函数的参数,而不是复制。
    【解决方案2】:

    另一种解决方案是将drive 更改为fun drive(Array&lt;out Car&gt;) { ... }。这当然意味着驱动器内的汽车不能修改,但可以避免复制。

    【讨论】:

      【解决方案3】:
      override fun checkMatch(vararg cards: SetsCard): Int {
          return if (isSet(*cards)) 16 else -2
      }
      
      private fun isSet(vararg cards: SetsCard) : Boolean {
          if (cards.size == 3) {
              return true
          }
          return false
      }
      

      【讨论】:

        【解决方案4】:
        fun foo(vararg strings: String): Array<out String> {
            return strings
        }
        
        //  Define a var 
        var yourVar: Array<out String> = foo("a", "b", "c")
        
        // Use var in Java method `public void javaMethod(String... someParam)() {}`
        javaMethod(*yourVar)
        

        【讨论】:

          【解决方案5】:

          本质上,您需要在变量名之前使用 vararg 键。

          fun args(vararg cars: Car) {
             //use cars as an array 
          }
          

          【讨论】:

          • 即使你想将它添加到第二个函数中,这也无法修复编译错误。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-09-12
          • 2013-04-13
          • 1970-01-01
          • 2013-05-03
          • 1970-01-01
          • 1970-01-01
          • 2022-01-19
          相关资源
          最近更新 更多