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

标签 collections kotlin

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

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 实际上是一个 List,它被认为是不可变的。并转换它,让它被改变。

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

最佳答案

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

从一个单独的 SO 答案中提到了一个 here .

Readonly - you are NOT supposed to change it (Kotlin's List) but something may (cast to Mutable, or change from Java).

List 只是一个没有变异方法的接口(interface),但是如果你将它强制转换为 MutableList,你可以更改实例。

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

Kotlin List 是只读的,不是不可变的。其他调用者(例如 Java)可能会更改列表。 Kotlin 调用者可能会转换列表并更改它。没有不可变的保护。

原始来源:Kotlin and Immutable Collections?

关于collections - Kotlin:通过强制转换修改(不可变)列表,合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956425/

相关文章:

C#交集两个集合返回具有相交索引和新字段的集合

Java 集合最大 NullPointerException

java - 通过java中的两个属性键将(最小)对象保留在集合中

android - 如何在 Android 应用程序中每天重复一个 Action ?

java - 用于保存大型 char/byte/int 数组的内存存储的最佳库?

javascript - 如何创建一个 javascript 类并使用索引/名称查找访问内部集合?

gradle - 在Kotlin构建文件中执行注册的任务

algorithm - 在排名(排序)列表上执行前缀搜索的有效方法?

android - 新 Flutter 项目的 `Unresolved reference: android`

java - 是否可以选择记录的所有值,而不必单独选择每个值?