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

2023-12-26

我们知道 Kotlin 中的列表是不可变的,即您不能像下面那样添加和删除。

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

但是,如果我们将其转换为 ArrayList,如下所示,则添加和删除工作有效。

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

我只是觉得这很奇怪,因为 myList 实际上是一个列表,它应该是不可变的。并铸造它,允许它被改变。

上面所做的事情(转换为数组并修改内容)是否合法,或者语言需要改进以禁止这样做?


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

在一个单独的 SO 答案中提到了一个here https://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections.

只读 - 您不应该更改它(Kotlin 的列表),但某些内容可能(转换为 Mutable,或从 Java 更改)。

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

然后有人继续评论说,Kotlin 选择只读是为了直接使用 Java 集合,因此在使用 Java 集合时没有开销或转换。

Kotlin List 是只读的,不是不可变的。其他调用者(例如 Java)可能会更改该列表。 Kotlin 调用者可能会投射该列表并更改它。不存在一成不变的保护。

原始来源:Kotlin 和不可变集合? https://stackoverflow.com/questions/33727657/kotlin-and-immutable-collections

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin:通过强制转换修改(不可变)列表,合法吗? 的相关文章

随机推荐