Bah*_*man 3 kotlin immutable-collections
为什么在Kotlin发生这种情况:
val list: List<Int> = listOf(1, 2, 3)// Immutable list
if(list is MutableCollection<*>){// why this "if" condition is true?
println("is mutable")// this line is printed
(list as MutableCollection<Int>).add(4) // this results to java.lang.UnsupportedOperationException
}
Run Code Online (Sandbox Code Playgroud)
list is MutableCollection
返回true,显示Kotlin不可变集合对象实现MutableCollection
接口,但不是更改它抛出的集合中的项目UnsupportedOperationException
这是真的吗?如果是,为什么Immutable集合对象MutableCollection
在Kotlin中实现接口?
是因为Kotlin集合继承自Java集合并且更改方法(添加,删除,...)已经存在并且避免更改集合的唯一方法是覆盖它并抛出异常(即使这是真的它不是Kotlin不可变集合对象实现MutableCollection
接口所必需的,因为java改变集合方法已经存在并且可以被覆盖)?
不,这不是正确的解释.此代码应该可以帮助您了解正在发生的事情:
val list: List<Int> = listOf(1, 2, 3)
println("list class is = ${list::class.java}")
if(list is MutableCollection<*>) {
println("is mutable")
(list as MutableList<Int>)[0] = 42
println(list)
}
Run Code Online (Sandbox Code Playgroud)
输出是
list class is = class java.util.Arrays$ArrayList
is mutable
[42, 2, 3]
Run Code Online (Sandbox Code Playgroud)
因此,解释是listOf(1, 2, 3)
返回一个Arrays $ ArrayList列表,即通过Java返回的列表Arrays.asList(1, 2, 3)
.它是一个可变列表,但你不能添加任何东西,因为它有一个固定的大小,因为它由一个数组支持.
Kotlin列表并非真正不可变.他们只是没有任何允许变异的方法:它们只是不可变的接口,只暴露实际可变列表的只读方法.如果你欺骗并将列表转换为可变列表,那么,如果列表实际上是一个Java列表,则转换将成功,但你不知道你是否真的能够改变它们,就像在Java中一样:List可以是一个空列表,它根本不能变异,或者像上例中的不可调整大小的列表,或者像ArrayList这样的完全可变列表.
归档时间: |
|
查看次数: |
86 次 |
最近记录: |