kotlin - 为什么我可以在 Kotlin 中将 MutableList 实例化为 val(并向其中添加元素)?
问题描述
我刚刚处于学习 Kotlin 的早期阶段,所以我播放了一个视频,展示了许多常见的 Kotlin 习语:Kotlin 教程
就在视频中的 1:03:10 点,演示者讨论了可变和不可变集合。正如您在视频中看到的那样,他使用 var 关键字创建了一个 MutableList,并使用 val 关键字创建了一个不可变的 List。我很想知道如果我尝试将 val 与 MutableList 一起使用会发生什么错误;我认为这是不允许的,IDEA 会显示一条消息,但它没有给我任何错误消息。然后我向 MutableList 添加了一个元素,这也没有导致错误!当我显示 MutableList 的最后一个元素时,它显示了我添加的元素,因此它不仅没有给我一个错误,它还成功地将一个元素添加到我认为不可变的东西中。
为什么我的代码有效?我不敢相信像我这样的 Kotlin 初学者在 Kotlin 中发现了一个基本错误,所以肯定有其他事情发生。有人可以解释吗?
这是我的代码:
val list3: MutableList<Int> = mutableListOf(6,7,8)
list3.add(5)
println("list3 last item: ${list3.last()}")
println() 语句显示:
list3 last item: 5
解决方案
val
仅意味着不能重新分配变量本身。它没有说明该变量中的对象是否可变。
如果你试图这样做,你会得到一个错误
val list3: MutableList<Int> = mutableListOf(6,7,8)
list3 = mutableListOf(1,2,3) // cannot re-assign to val
推荐阅读
- tailwind-css - 顺风不同的主题
- javascript - Javascript - 根据函数的返回值输入 Switch case
- android - 如何更改文本字段的输入类型并在android中同时只允许十六进制输入?
- r - glm.fit:算法没有收敛错误
- c - 汇编函数 (gdb) 中的 __kernel_vsyscall
- angular - 在服务上收到回调后 Angular 9 刷新组件
- c - 如何编写一个程序,为每个创建 2 个父进程和一个子进程?
- apache-spark - Spark 流式传输与结构化流式传输
- bash - 触发器列出 bash 函数中的所有完成行为
- electron - 如何修改使用电子打包器创建的包中的“版本”文件内容?