(imutable集合是可变的)在Kotlin中返回true
科特林发生这种情况的原因:(imutable集合是可变的)在Kotlin中返回true,kotlin,immutable-collections,Kotlin,Immutable Collections,科特林发生这种情况的原因: 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)
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
}
val list:list=listOf(1,2,3)//不可变列表
if(list is MutableCollection){//为什么这个“if”条件为真?
println(“是可变的”)//此行已打印
(作为MutableCollection列出)。添加(4)//此结果到java.lang.UnsupportedOperationException
}
list is MutableCollection
返回true,显示Kotlin Immutable collection对象实现了MutableCollection
接口,但不是更改集合中的项,而是抛出UnsupportedOperationException
这是真的吗?如果是,为什么不可变集合对象在Kotlin中实现MutableCollection
接口
这是因为Kotlin集合继承自Java集合,并且已经存在更改方法(add、remove,…),避免更改集合的唯一方法是重写它并引发异常(即使这是真的,Kotlin immutable collection对象也没有必要实现
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)
}
因此,解释是,listOf(1,2,3)
返回一个Arrays$ArrayList列表,即在Java中通过执行Arrays.asList(1,2,3)
返回的列表。它是一个可变列表,但不能向其中添加任何内容,因为它有一个固定的大小,因为它由数组支持
Kotlin列表并不是真正不可变的。它们只是没有任何方法允许对它们进行变异:它们只是不可变的接口,只公开实际可变列表的只读方法。如果您欺骗列表并将其强制转换为可变列表,那么,如果该列表实际上是Java列表,则强制转换将成功,但您无法知道您是否真的会这样做可以对它们进行变异,就像在Java中一样:列表可以是一个根本不能变异的空列表,也可以是上面示例中的不可调整大小的列表,或者是一个完全可变的列表,比如ArrayList。谢谢,在Kotlin中,Java类(例如,
ArrayList
)如何实现Kotlin接口(MutableList
)因为已经创建了Java类,但它们无法实现Kotlin接口,这是Kotlin魔力的一部分,使其能够与Java互操作:Java集合被视为可变Kotlin集合的实现,可变Kotlin集合本身扩展了非可变集合接口。请参阅
list class is = class java.util.Arrays$ArrayList
is mutable
[42, 2, 3]