我们知道 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 调用者可能会转换列表并更改它。没有不可变的保护。
关于collections - Kotlin:通过强制转换修改(不可变)列表,合法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37956425/