正如Kotlin文档所说,listOf<T>
具有三种实现:无参数,一个参数和varargs。每个函数应返回不可变的List<T>
。
val emptyList = listOf<String>()
val oneArgList = listOf("asd")
val varargsList = listOf("asd", "asd")
if (emptyList is MutableList) println("emptyList is mutable")
if (oneArgList is MutableList) println("oneArgList is mutable")
if (varargsList is MutableList) println("varargList is mutable")
上面代码的执行导致
oneArgList is mutable
varargList is mutable
为什么这样工作?这是期望的行为吗?
最佳答案
如果您查看源代码,则会发现它实际上创建了Java ArrayList
。这利用了JDK,而不必在Kotlin中实现ArrayList
。请注意,即使转换成功,对MutableList
的转换也是一种不好的编码习惯,因为listOf()
函数已经指定它为List
而不是MutableList
。
另一方面,emptyList()
(或listOf()
)使用在Kotlin中实现的EmptyList
单例,它是真正不变的。
其实不行但是,它确实可以提供一个不可变的接口(interface)。只要备份数据结构符合接口(interface)协定,那么究竟该如何准确地实现备份数据结构并不重要。作为程序员,您在使用契约(Contract)时也应遵守契约(Contract)。