Kotlin:通过强制转换修改(不可变)列表,这是合法的吗?

Ely*_*lye 6 collections kotlin

我们知道Kotlin中的List是不可变的,即你不能像下面那样添加和删除.

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        myList!!.add(10)
        myList!!.remove(10)
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如果我们将它转​​换为ArrayList,如下所示,添加和删除工作.

class TempClass {
    var myList: List<Int>? = null
    fun doSomething() {
        myList = ArrayList<Int>()
        (myList!! as ArrayList).add(10)
        (myList!! as ArrayList).remove(10)
    }
}
Run Code Online (Sandbox Code Playgroud)

我只是觉得这很奇怪,因为myList实际上是一个List,它假设是不可变的.铸造它,允许它被改变.

上面做了什么(强制转换为Array并修改内容)是合法的,还是语言需要改进才能禁止?

fuz*_*uzz 6

有几种不同类型的不变性:

这里有一个单独的答案提到了一个.

Readonly - 你不应该改变它(Kotlin的列表),但有些东西可能(强制转换为Mutable,或者从Java改变).

List只是一个没有变异方法的接口,但如果将其转换为实例,则可以更改该实例MutableList.

然后有人继续评论Kotlin为了直接使用Java集合而选择只读,因此使用Java集合没有任何开销或转换.

Kotlin List是readonly,而不是一成不变的.其他调用者(例如Java)可能会更改列表.Kotlin调用者可能会列出并更改它.没有不可改变的保护.

原始来源:Kotlin和Immutable Collections?