0

众所周知,在 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

    Type mismatch: inferred type is String but Nothing was expected
分别...

我的问题是
为什么这些嵌套子列表 - 声明为可变 - 表现得像不可变?
有没有办法改变这些嵌套的子列表???


顺便说一句...
我已经检查过,声明为可变的嵌套子列表在它们都是相同类型时表现得非常正常。
在这种情况下,可以 - 正如预期的那样 - 更改那些嵌套的子列表......

4

1 回答 1

2

由于 MutableList 是类型化的,因​​此您必须在向其添加项目之前让编译器知道子列表的确切类型。以下代码:

(list[0] as MutableList<Int>)[1] = 2
(list[1] as MutableList<String>).add("bbb")

效果很好。但是,当您尝试强制转换为错误的 MutableList 类型时,仍然可能在运行时遇到问题,这就是报告警告(“未检查强制转换”)的原因。

当所有子列表的类型相同时,例如Int顶级list类型由编译器明确推断,MutableList<MutableList<Int>>因此您不必显式告诉编译器子列表的类型,因为它已经知道它们。但是当子列表的类型不同时,编译器会推断list's 的类型并限制您仅调用(eg )MutableList<MutableList<Any>>的非类型化方法而不进行强制转换。MutableListclear()

于 2021-10-28T02:34:59.070 回答