¿Cómo pasar vararg como matriz para funcionar en Kotlin?

Quiero pasar vararg de la function de compra a la function de unidad pero obtengo

un error de compilation:

requinetworking Array<T> found Array<out T> 

código:

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

    Otra solución sería cambiar el drive a la drive de fun drive(Array<out Car>) { ... } . Esto, por supuesto, significa que los autos que se encuentran dentro de la unidad no se pueden modificar, pero se evita la copy.

    El error exacto es:

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

    El problema es que cuando tienes un vararg cars: Car parámetro de function vararg cars: Car , su tipo dentro de la function es Array<out Car> , que básicamente representa una matriz de solo lectura de los arguments con los que se invocó la function – después de todo, no lo haría Realmente sería bueno empezar a modificar los arguments que obtuviste como vararg (los parameters de function en Kotlin son val solo lectura, y esto es algo muy similar).

    Pero su function de drive requiere un Array<Car> regular, que por supuesto también se puede escribir. Por lo tanto, si desea conservar estas firmas de funciones, deberá crear una nueva matriz que contenga todo desde su matriz de solo lectura. Esto se puede crear usando la siguiente syntax:

     drive(arrayOf(*cars)) 

    Esto llama a la function arrayOf que generalmente creamos arrays, que toma un parámetro vararg, y usa el operador spread, que es una forma de pasar los elementos de una matriz (which cars es, dentro de la function buy ) como los parameters vararg ( docs) aquí ).

    Si bien todo esto puede sonar complicado, en realidad es una solución muy eficiente, ya que solo usa Array.copyOf bajo el capó en el bytecode.

    Esencialmente necesitas la key vararg antes del nombre de la variable.

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