我正处在学习Kotlin的初期阶段,所以我播放了一个视频,其中显示了许多常见的Kotlin习语:Kotlin tutorial
仅在视频中的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
答案 0 :(得分:4)
val
仅表示变量本身不能重新分配。它没有说明该变量中的对象是否可变。
如果您尝试这样做,将会得到一个错误
val list3: MutableList<Int> = mutableListOf(6,7,8)
list3 = mutableListOf(1,2,3) // cannot re-assign to val
答案 1 :(得分:0)
val
表示值,因此您可以一次将val
分配给对象,就像Java中的final
关键字一样。当您尝试重新分配val
时,将发生错误。
val list3: MutableList<Int> = mutableListOf(6,7,8)
list3.add(5)
println("list3 last item: ${list3.last()}")
在上面的示例中,您没有为list3
分配新对象,而只是对列表进行了更改/添加新值。
val list3: MutableList<Int> = mutableListOf(6,7,8)
list3 = mutableListOf(1,2,3)
在上面的示例中,将发生错误,因为我们尝试为list3
分配一个mutableList
的新实例
希望有帮助