【问题标题】:Why can I instantiate a MutableList as a val in Kotlin (and also add elements to it)?为什么我可以在 Kotlin 中将 MutableList 实例化为 val(并向其中添加元素)?
【发布时间】:2019-07-10 04:46:51
【问题描述】:

我刚刚处于学习 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

【问题讨论】:

    标签: kotlin


    【解决方案1】:

    val 只表示变量本身不能重新赋值。它没有说明该变量中的对象是否可变。

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

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

    【讨论】:

      【解决方案2】:

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

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 1970-01-01
        • 2020-04-11
        • 2022-01-14
        相关资源
        最近更新 更多