Kotlin:MutableList中的java.lang.UnsupportedOperationException添加元素
我在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] } } }
我试图执行使用此代码:
fun main(args: Array<String>) { var initialValue = listOf<Int>(10) as MutableList<Int> var stack = Stack<Int>(initialValue) stack.push(22) println(stack.count()) println(stack.isEmpty()) println(stack.pop()) println(stack.count()) println(stack.isEmpty()) }
当我运行代码时,我收到这个错误:
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) at Stack.push(Stack.kt:17) at StackKt.main(Stack.kt:45) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)
这与在push(element:T)方法中实现的跟随行有关:
this.items.add(position, element)
最奇怪的是我用了一个非常相似的代码实现一个orderedArray ,它的工作完美。
你有什么想法我做错了吗?
listOf<Int>
不是真正可变的。 根据文件 :
fun <T> listOf(vararg elements: T): List<T> (source)
返回给定元素的新的只读列表。 返回的列表是可序列化的(JVM)。
你应该使用mutableListOf<>
。
为什么as MutableList
这里允许as MutableList
是因为listOf(10)
返回Collections.singletonList(10)
,它返回一个java.util.List
(Kotlin假设实现了kotlin.collections.MutableList
接口)。 所以编译器并不知道在运行时调用mutating方法并抛出异常之前它不是真的可变的。