如何通过可变参数作为数组在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操作符来传递一个数组的元素( cars
在buy
函数中)作为可变参数( docs这里 )。
虽然这听起来很复杂,但实际上它是一个非常有效的解决方案,因为它只是在字节码的Array.copyOf
使用Array.copyOf
。
另一种解决方案是将drive
更改为fun drive(Array<out Car>) { ... }
。 这当然意味着车内的车辆不能修改,但是避免了复制。
特别是你需要变量名前面的可变关键字。
fun args(vararg cars: Car) { //use cars as an array }