Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
(imutable集合是可变的)在Kotlin中返回true_Kotlin_Immutable Collections - Fatal编程技术网

(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]