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方法并抛出异常之前它不是真的可变的。

Interesting Posts