Kotlin:java.lang.UnsupportedOperationException在MutableList add元素中
我在Kotlin实现了一个堆栈算法,用于学习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
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=listOffun 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]
}