У меня есть метод, принимающий vararg вида
fun arrayOfArrays(vararg aoa: Array<Any>) {
}
Теперь у меня проблемы с пониманием, как вызвать этот метод, например,
fun callArrayOfArrays() {
arrayOfArrays(arrayOf(1), arrayOf(1)) // 0) works
val a = arrayOf(1)
arrayOfArrays(a, a) // 1) type mismatch: inferred type Array, but Array was expected
val aoa = arrayOf(a)
arrayOfArrays(aoa) // 2) type mismatch: inferred type Array<array>, but Array was expected
arrayOfArrays(*aoa) // 3) type mismatch: inferred type Array<array>, but Array<out array> was expected
arrayOfArrays(aoa.toList().toTypedArray()) // 4) works
}
ОБНОВЛЕНИЕ: ПослеПолучив известность от коллеги, мы решили, что добавление типов в arrayOf () решает некоторые из моих проблем, то есть следующее работает сейчас:
fun callArrayOfArrays() {
arrayOfArrays(arrayOf(1), arrayOf(1))
val a = arrayOf<Any>(1)
arrayOfArrays(a, a)
val aoa = arrayOf<Array<Any>>(a)
arrayOfArrays(*aoa)
arrayOfArrays(aoa.toList().toTypedArray())
arrayOfArrays(*(aoa.toList().toTypedArray()))
}
Я все еще считаю, что первое должнотоже будет хорошоИ я жажду понятного объяснения этого поведения.
Я ценю, что случай 0 работает, но я не понимаю всех остальных случаев.
Для случая 1 я ожидал бы, что назначениепеременная arrayOf (1) для переменной не меняет семантику, но мы здесь.
Для случая 2 я ожидаю, что он будет работать так же, как и для первого случая, просто «Any»будучи Массивом здесь.
Для случая 3 я вижу разницу, но я не понимаю этого и, конечно, не знаю, как заставить это работать.
Для случая 4,Я считаю, что это Vararg, принимающий один массив.Тем не менее, я не могу распространять это тоже.