为什么不同类型的可变列表在放入可变列表中时表现为不可变的



正如我们所知,在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())而不进行强制转换。

相关内容

  • 没有找到相关文章

最新更新