为什么我可以在 Kotlin 中将 MutableList 实例化为 val(并向其中添加元素)?

Hen*_*nry 0 kotlin

我正处于学习 Kotlin 的早期阶段,所以我播放了一个视频,其中展示了许多常见的 Kotlin 习语:Kotlin 教程

就在视频的 1:03:10 处,演示者讨论了可变和不可变集合。正如您在视频中看到的,他使用 var 关键字创建了一个 MutableList,并使用 val 关键字创建了一个不可变列表。我很好奇如果我尝试将 val 与 MutableList 一起使用会发生什么错误;我认为这是不允许的,IDEA 会显示一条消息,但它没有给我任何错误消息。然后我向 MutableList 添加了一个元素,这也没有导致错误!当我显示 MutableList 的最后一个元素时,它显示了我添加的元素,因此它不仅没有给我一个错误,而且成功地将一个元素添加到我认为不可变的元素中。

为什么我的代码可以工作?我不敢相信像我这样的 Kotlin 初学者竟然发现了 Kotlin 中的一个基本错误,所以一定还有其他原因。有人可以解释一下吗?

这是我的代码:

val list3: MutableList<Int> = mutableListOf(6,7,8) 
list3.add(5)
println("list3 last item: ${list3.last()}")
Run Code Online (Sandbox Code Playgroud)

println() 语句显示:

list3 last item: 5
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 5

val仅仅意味着变量本身不能被重新赋值。它没有说明该变量中的对象是否可变。

如果你尝试这样做,你会得到一个错误

 val list3: MutableList<Int> = mutableListOf(6,7,8)
 list3 = mutableListOf(1,2,3)   // cannot re-assign to val
Run Code Online (Sandbox Code Playgroud)