正如我们所知,在Kotlin中可以为不同类型的可变列表创建一个可变列表,例如:
val list = mutableListOf(
MutableList<Int>(3) { 0 },
MutableList<String>(2) { "aaa" }
)
,并且可以(如预期的那样)更改主列表,例如:
list.add(MutableList<Double>(4) { 0.0 }
,执行此操作后,println(list)
的结果如下:
[[0, 0, 0], [aaa, aaa], [0.0, 0.0, 0.0, 0.0]]
但这是不可能的要更改子列表,
例如:操作:
list[0][1] = 2
list[1].add("bbb")
产生错误消息:
整型字面值不符合预期类型Nothing
和
类型不匹配:推断类型是String,但Nothing是预期的
分别…
我的问题是:
为什么这些嵌套子列表——声明为可变的——表现得像它们是不可变的??
是否有办法改变这些嵌套子列表??
顺便说一下…
我已经检查过了,嵌套子列表声明为可变的,当它们都是相同类型时,行为很正常。
可以——正如预期的那样——在这种情况下改变那些嵌套的子列表…
由于MutableList是类型化的,因此在向其添加项之前必须让编译器知道子列表的确切类型。代码:
(list[0] as MutableList<Int>)[1] = 2
(list[1] as MutableList<String>).add("bbb")
行之有效。但是,在运行时,当您尝试转换为错误的mutableelist类型时,仍然可能会出现问题,这就是为什么会报告警告("Unchecked cast")。
当所有子列表都是相同类型的例如,Int
顶级list
类型被编译器毫不含糊地推断为MutableList<MutableList<Int>>
,所以你不必显式地告诉编译器子列表的类型,因为它已经意识到它们。但是,当子列表的类型不同时,编译器将list
的类型推断为MutableList<MutableList<Any>>
,并限制您只调用MutableList
的非类型方法(例如clear()
)而不进行强制转换。