Kotlin: Lista modificable (inmutable) a través del reparto, ¿es legítimo?

Como sabemos, la Lista en Kotlin es inmutable, es decir, no se puede agregar y eliminar como se indica a continuación.

class TempClass { var myList: List<Int>? = null fun doSomething() { myList = ArrayList<Int>() myList!!.add(10) myList!!.remove(10) } } 

Pero si lo lanzamos a ArrayList como a continuación, agregar y eliminar funciona.

 class TempClass { var myList: List<Int>? = null fun doSomething() { myList = ArrayList<Int>() (myList!! as ArrayList).add(10) (myList!! as ArrayList).remove(10) } } 

Solo pensé que esto es extraño, ya que myList es realmente una Lista, que se supone que es inmutable. Y lanzándolo, permita que sea alterado.

¿Es legítimo lo que se hace arriba (enviar a Matriz y modificar el contenido) o el lenguaje debe mejorar para no permitirlo?

Hay algunos types diferentes de inmutabilidad:

Uno se menciona a partir de una respuesta SO separada aquí .

Solo lectura: NO debes cambiarlo (Lista de Kotlin) pero algo puede (enviarse a Mutable o cambiar de Java).

List es solo una interfaz que no tiene methods de mutación, pero puede cambiar la instancia si la MutableList a MutableList .

Luego, alguien comenta que Kotlin eligió ser de solo lectura para usar las collections de Java directamente, por lo que no hay gastos generales ni conversiones en el uso de las collections de Java.

La list de Kotlin es de solo lectura, no inmutable. Otros llamadores (Java, por ejemplo) pueden cambiar la list. Los llamadores de Kotlin pueden lanzar la list y cambiarla. No hay protección inmutable.

Fuente original: Kotlin y collections inmutables?

¿Es legítimo? Bueno, sí. Hay usos casos en los que eso tendría sentido.

¿Es una buena idea? Creo que no, especialmente si estás hablando de enviar una list que fue devuelta por alguna biblioteca externa. El elenco fallará si alguien realmente le entrega algunas implementaciones de List que realmente son inmutables y no implementa MutableList . El hecho de que en este momento (Kotlin 1.0.2), todas las Lists de Kotlin sean también MutableList s no significa que cada List que veas en tu código sea también una MutableList .

Ahora mismo si usa listOf () obtendrá una list con todos los methods, que mute la list, lanzando java.lang.UnsupportedOperationException:

 val list = listOf(1, 2) val mlist = list as MutableList mlist.add(3) 

Esto arroja:

 Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:148) 
  • ¿Cómo inyectar variables primitivas en Kotlin?
  • Alcance del modificador de visibilidad interna en Kotlin
  • Cómo instanciar una nueva instancia de tipo genérico
  • ¿Cómo saltarse los models proguard utilizados por retrofit2 que está en el package base?
  • Kotlin - Transforma el valor en la initialization
  • Extensión de Kotlin Any? .toString ()
  • Multiplicación de Kotlin entre los errores de flotación que aceptan nulos y los que no admiten nulos incluso con verificación nula
  • La mejor forma de implementar el patrón de visitante en Kotlin
  • Tipo de security con campos opcionales en una class de datos para JSON
  • Dagger2 + Kotlin, inyección no funciona
  • Comstack el código de kotlin tanto para JVM como para JavaScript