如何通过可变参数作为数组在Kotlin中的功能?

我想从购买功能vararg通过驱动器功能,但我得到了

编译错误:

required Array<T> found Array<out T> 

码:

 class Car fun buy(vararg cars: Car) { drive(cars) //compile error } fun drive(cars: Array<Car>) { //... } 

确切的错误是:

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

问题是,当你有一个vararg cars: Car参数vararg cars: Car函数参数,它的函数内部的类型是Array<out Car> ,它基本上代表了函数被调用的参数的只读数组 – 毕竟,它不会'开始修改你得到的参数是一个很好的事情(Kotlin中的函数参数是只读的,这是非常相似的)。

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

 drive(arrayOf(*cars)) 

这就调用了arrayOf函数,我们通常会创建一个数组,其中包含一个可变参数,并使用spread操作符来传递一个数组的元素( carsbuy函数中)作为可变参数( docs这里 )。

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

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

特别是你需要变量名前面的可变关键字。

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