【发布时间】:2016-06-21 23:55:33
【问题描述】:
我们知道 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 并修改内容)是否合法,或者需要改进语言以禁止这样做?
【问题讨论】:
-
提供的链接确实解释了 List 不是不可变的,而是可读的。但是鉴于此,“可读”实际上并没有那么“有用”,它仍然可以被强制更改。理想情况下,不应将“可读”转换为“可写”
-
投到
MutableList就够了,ArrayList的超类型 -
看起来您正在尝试在分配后初始化列表。在这种情况下,您可以使用
ArrayList<Int>().apply { add(10) }或者更好地使用内置的工厂函数,例如listOf(10)。 -
今天添加到 Klutter 库的阻止将 List 转换为可变(和其他集合类型)蜡的阻止程序阻止了所有相关操作,例如从列表中收到的
Iterator,从列表中收到的subList列表,来自地图的entrySet等等。请参阅:stackoverflow.com/a/38002121/3679676 ...您不能围绕它进行投射,也不能对其返回任何其他集合,它们是真正受到保护的。
标签: collections kotlin