Kotlin: java.lang.UnsupportedOperationException en MutableList add element

Estoy implementando un algorithm de stack para fines de estudio en 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] } } } 

Y estoy tratando de ejecutar usando este código:

 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()) } 

Cuando ejecuto el código recibo este error:

 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) 

Esto está relacionado con la siguiente línea que se implementa en el método push (elemento: T) :

  this.items.add(position, element) 

Lo más extraño es que utilicé un código muy similar implementando un array orderado y funciona perfectamente.

¿Tienes alguna idea de lo que estoy haciendo mal?

    listOf<Int> no es realmente mutable. De acuerdo con el documento :

    fun <T> listOf(vararg elements: T): List<T> (source) Devuelve una nueva list de solo lectura de elementos dados. La list devuelta es serializable (JVM).

    Debería usar mutableListOf<> lugar.

    La razón por la cual as MutableList está permitida aquí es porque listOf(10) devuelve Collections.singletonList(10) que devuelve java.util.List (que Kotlin supone que implementa la interfaz kotlin.collections.MutableList ). Entonces, el comstackdor no sabe que no es realmente mutable hasta que se llama al método de mutación en time de ejecución y arroja la exception.