Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.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
Kotlin:java.lang.UnsupportedOperationException在MutableList add元素中_Java_Algorithm_Stack_Kotlin - Fatal编程技术网

Kotlin:java.lang.UnsupportedOperationException在MutableList add元素中

Kotlin:java.lang.UnsupportedOperationException在MutableList add元素中,java,algorithm,stack,kotlin,Java,Algorithm,Stack,Kotlin,我在Kotlin实现了一个堆栈算法,用于学习 class Stack<T:Comparable<T>>(list:MutableList<T>) { var items: MutableList<T> = list fun isEmpty():Boolean = this.items.isEmpty() fun count():Int = this.items.count() fun push(elemen

我在Kotlin实现了一个堆栈算法,用于学习

class Stack<T:Comparable<T>>(list:MutableList<T>) {

    var items: MutableList<T> = list


    fun isEmpty():Boolean = this.items.isEmpty()

    fun count():Int = this.items.count()

    fun push(element:T) {
        val position = this.count()
        this.items.add(position, element)
    }

    override  fun toString() = this.items.toString()

    fun pop():T? {
        if (this.isEmpty()) {
            return null
        } else {
            val item =  this.items.count() - 1
            return this.items.removeAt(item)
        }
    }

    fun peek():T? {
        if (isEmpty()) {
            return null
        } else {
            return this.items[this.items.count() - 1]
        }
    }

}
这与在推送(元素:T)方法中实现的以下行有关:

 this.items.add(position, element)
最奇怪的是,我使用了一个非常类似的代码实现了一个,它工作得非常完美

你知道我做错了什么吗?

listOf
不是真正可变的。根据:

funlistof(vararg元素:T):List(源代码)
返回给定元素的新只读列表。返回的列表是 可序列化(JVM)

你应该改用


这里之所以允许
作为可变列表
,是因为
listOf(10)
返回
Collections.singletonList(10)
,它返回一个
java.util.List
(Kotlin假设它实现了
Kotlin.Collections.MutableList
接口)。因此,在运行时调用mutating方法并抛出异常之前,编译器并不知道它实际上是不可变的。

您可以通过调用toMutableList()api而不是使用smart cast(as)来修复此问题

Try:var initialValue=listOf(10)

下面是一个工作示例:

fun main(){
    val x : List<String> = listOf("foo", "bar", "baz")
    //val y: MutableList<String> = x as MutableList<String> throws UnsupportedOperationException
    val y: MutableList<String> = x.toMutableList()
    y.add("sha")
    println(y) // [foo, bar, baz, sha]
}
fun main(){
val x:List=listOf(“foo”、“bar”、“baz”)
//val y:MutableList=x,因为MutableList引发UnsupportedOperationException
val y:MutableList=x.toMutableList()
y、 添加(“sha”)
println(y)/[foo,bar,baz,sha]
}

因此,在主方法中,解决方案是使用mutableListOf而不是listOf设置initialvalue,对吗?强制转换合法的解释如下:
List
是一个接口,
MutableList
是一个扩展
List
的接口。因此,从
List
MutableList
的强制转换是合法的,但它可以并且将在运行时崩溃。感谢Kirill的解释@KirillRakhman编译时确实允许强制转换,但这是因为
listOf
返回一个
java.util.List
,该接口实现
kotlin.collections.MutableList
接口。因此,它不会在强制转换时崩溃,而是在调用
add
时崩溃,当实现抛出异常时。Kotlin的
List
MutableList
在编译时都映射到
java.util.List
,在运行时根本不存在。
 this.items.add(position, element)
fun main(){
    val x : List<String> = listOf("foo", "bar", "baz")
    //val y: MutableList<String> = x as MutableList<String> throws UnsupportedOperationException
    val y: MutableList<String> = x.toMutableList()
    y.add("sha")
    println(y) // [foo, bar, baz, sha]
}