Метод Java toArray , который вы вызываете, возвращает тип Object[]
, который в Kotlin равен Any[]
.Проблема в том, что вызов конструктора CycleArray
ожидает тип T
.
Интерфейс List
предоставляет еще один toArray , который принимает инициализированный массив ожидаемого типа для определения правильного возвращаемого типа.Это, однако, не будет работать с универсальным типом, так как тип должен быть известен во время компиляции.Существует особый способ обойти проблему такого рода в koltin, которая заключается в использовании типа reified :
inline fun <reified T> cycle(vararg idxs : Int) : CycleArray<T> {
val ret = elems.sliceArray(1 until elems.size).toCollection(ArrayList())
ret.add(0, elems[elems.size - 1])
return CycleArray<T>(ret.toArray(arrayOf<T>()))
}
Однако это не совсем подходит для вашей ситуации, поскольку класс является универсальнымне метод.Недостатком этого является то, что вам придется указывать тип при вызове метода:
val obj = CycleArray<Int>(arrayOf(1, 2, 3))
val result = obj.cycle<Int>()
Это, безусловно, не идеально, но будет работать.В противном случае вы должны переосмыслить дизайн.Абсолютно необходимо, чтобы CycleArray
принял Array в качестве аргумента?Если нет, выберите Список для начала.