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

时间:2019-02-16 03:09:38

标签: kotlin

我正处在学习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

2 个答案:

答案 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的新实例

希望有帮助