Котлин: Могу ли я получить доступ к вложенному массиву из другого массива? - PullRequest
0 голосов
/ 03 ноября 2018

Это может быть глупый вопрос, но у меня есть массив:

var testarray = arrayOf(0,0,arrayOf(7,5,2))

Поэтому я попытался получить доступ ко второму массиву, набрав testarray[2][1]. Тем не менее, это выдает ошибку:

error: unresolved reference. None of the following candidates is applicable because of receiver type mismatch: 
@InlineOnly public inline operator fun <@OnlyInputTypes K, V> Map<out Int, ???>.get(key: Int): ??? defined in kotlin.collections
testarray[2][1]
^
error: no get method providing array access
testarray[2][1]

Есть ли способ доступа к вложенному массиву?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Я также думаю, что вы должны переосмыслить свой дизайн, как уже сказал Дж. Б. Низет.

Вы можете сделать это, обобщив ваш массив в массив массивов, например:

val testArray = arrayOf(arrayOf(0), arrayOf(0), arrayOf(7, 5, 2))

, который гарантирует, что вы можете получить и установить элементы следующим образом:

testArray[2][1]
testArray[2][0] = 4

Пока вы просто хотите получить доступ к элементам описанным вами способом, сохраняя свой дизайн, вы можете создать (локальную) функцию расширения оператора get на Serializable, например:

operator fun Serializable.get(i: Int) = (this as? Array<*>)?.get(i) ?: this

val a = arrayOf(0, 0, arrayOf(7,5,2))

println(a[1][0]) // 0
println(a[2][1]) // 5
0 голосов
/ 03 ноября 2018

Ваш внешний массив содержит Ints и массив. Таким образом, его фактический объявленный тип (который вы могли бы указать или разрешить для вас в IDE) - Array<Serializable>.

A Serializable может быть чем угодно. Компилятор не знает, что элемент с индексом 2 оказывается массивом. Поэтому он не может позволить вам использовать оператор []. Вам нужно привести элемент к массиву, чтобы сделать это:

println((testarray[2] as Array<Int>)[1])

Это решило бы проблему компиляции, но не проблему дизайна. Использование массивов в целом - это уже запах, но использование массивов, содержащих смешанные типы, - еще больший запах. Вы должны пересмотреть свой дизайн.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...