Как передать vararg как массив для работы в Kotlin?

Я хочу передать vararg из функции buy в функцию привода, но я получаю

ошибка компиляции:

required Array<T> found Array<out T> 

код:

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

Другим решением было бы сменить drive на fun drive(Array<out Car>) { ... } . Это, конечно, означает, что автомобили внутри диска не могут быть изменены, но избегают копирования.

Точная ошибка:

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

Проблема в том, что когда у вас есть параметр vararg cars: Car function, его тип внутри функции Array<out Car> , который в основном представляет собой массив только для чтения аргументов, с которыми была вызвана функция, – в конце концов, На самом деле было бы неплохо начать изменять аргументы, которые вы получили как vararg (параметры функции в Kotlin – только для чтения val s, и это нечто очень похожее).

Но для вашей функции drive требуется обычный Array<Car> , который, конечно же, доступен для записи. Поэтому, если вы хотите сохранить эти сигнатуры функций, вам нужно будет создать новый массив, содержащий все из вашего только для чтения массива. Это можно создать с помощью следующего синтаксиса:

 drive(arrayOf(*cars)) 

Это вызывает функцию arrayOf мы обычно создаем массивы с, которая принимает параметр vararg и использует оператор спреда, который является способом передать элементы массива (какие cars находятся внутри функции buy ) в качестве параметров vararg ( docs здесь ).

Хотя все это может показаться сложным, на самом деле это очень эффективное решение, поскольку оно просто использует Array.copyOf под капотом в Array.copyOf .

В сущности, вам необходимо выполнить разметку vararg перед именем переменной.

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