如何将 vararg 作为数组传递给 Kotlin 函数?

How to pass vararg as array to function in Kotlin?

我想将可变参数从购买功能传递到驱动功能 但我得到

编译错误:

required Array<T> found Array<out T>

代码:

class Car

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

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

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

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

精确误差为:

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

问题是当你有一个 vararg cars: Car 函数参数时,它在函数内部的类型是 Array<out Car>,它基本上代表一个只读的参数数组,函数被调用时使用 -毕竟,开始修改作为 vararg 获得的参数并不是一件好事(Kotlin 中的函数参数是只读的 vals,这非常相似)。

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

drive(arrayOf(*cars))

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

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

另一个解决方案是将 drive 更改为 fun drive(Array<out Car>) { ... }。这当然意味着驱动器内的车不能修改,但避免了复制。

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
}
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)