小编JPI*_*Iyo的帖子

在 Kotlin 中将 ArrayList 转换为 List 时的不变性问题

我尝试深入了解 Kotlin 中的集合。这样做时我未能保持列表的可变性:

  val intsA = arrayListOf(1, 2, 3)
  val intsB: List<Int> = intsA
  intsA.add(4)
  println("intsA = $intsA && intsB = $intsB")
Run Code Online (Sandbox Code Playgroud)

结果:

intsA = [1, 2, 3, 4] && intsB = [1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

是的,我知道我正在传递引用,我可以通过执行以下操作更安全地做到这一点:

val intsB: List<Int> = intsA.toList()
Run Code Online (Sandbox Code Playgroud)

我仍然不太明白幕后发生了什么?为什么 Kotlin 中的默认转换不能更安全地完成?因为将这段代码放在代码中的某个位置然后认为它是不可变的然后使用它可能有点危险,如下所示:

fun main(args: Array<String>) {

    val intsA = arrayListOf(1)
    val intsB: List<Int> = intsA
    val myClass = MyClass(intsB)

    intsA.add(2)
    println("intsA = $intsA && intsB = $intsB && myClass = $myClass")

}

class MyClass(val list: List<Int>){
    override …
Run Code Online (Sandbox Code Playgroud)

reference immutability pass-by-reference kotlin

3
推荐指数
1
解决办法
1690
查看次数