如何访问Kotlin中ArrayList<Any>内的嵌套ArrayList?
访问Kotlin中的嵌套集合
你的问题出在y的泛型类型定义为ArrayList<Any>,导致取出的元素类型是Any,而非实际的List类型,所以无法直接访问内部集合的元素。下面提供两种可行的解决方法:
方法一:使用正确的泛型类型
直接将y的泛型指定为List<Any>,这样添加的元素类型明确,无需额外转换就能直接访问内部集合:
fun main() { // 明确泛型为List<Any>,因为split.map返回的是List<Any>(元素可能是Int或String) val y = ArrayList<List<Any>>() for (i in 1..2){ y.add(readln().split(' ').map { try { it.toInt() } catch (e: Exception) { it } }) } // 现在可以直接访问内部集合的元素 println(y[0][0]) // 访问第一个内部集合的第一个元素 println(y[1][1]) // 访问第二个内部集合的第二个元素 y.forEach { innerList -> innerList.forEach { element -> println(element) } } }
方法二:类型安全转换(保留原ArrayList的情况)
如果因为某些原因必须使用ArrayList<Any>,可以通过类型判断和安全转换来访问内部集合:
fun main() { val y = ArrayList<Any>() for (i in 1..2){ y.add(readln().split(' ').map { try { it.toInt() } catch (e: Exception) { it } }) } // 安全转换为List<Any>后访问 val firstInnerList = y[0] as? List<Any> firstInnerList?.let { println(it[0]) // 访问第一个元素 it.forEach { element -> println(element) } } // 遍历外层集合时,先判断元素类型 y.forEach { outerElement -> if (outerElement is List<*>) { outerElement.forEach { innerElement -> println(innerElement) } } } }
补充说明
你打印y[0]::class.simpleName得到的是ArrayList,是因为Kotlin中map函数默认返回的是ArrayList(具体实现类可能因版本略有不同),但它的接口类型是List,所以用List<Any>作为泛型更符合面向接口的编程习惯。
内容的提问来源于stack exchange,提问作者Meerza Al Fardan
相关产品推荐
相关产品推荐

