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) 
  • package de alternativa protegida en kotlin
  • Imposible get datos de la database sqlite
  • Kotlin cuádruple, quíntuple, etc. para desestructurar
  • ¿Por qué obtengo una android.os.TransactionTooLargeException en mi aplicación de Android escrita en Kotlin / rxJava cuando salgo de la aplicación? (onExit / onPause)?
  • Actualice el contenido de un fragment en SectionsPagerAdapter
  • Usar el object compañero para devolver una instancia de la class en Kotlin
  • Kotlin Simplifique la expresión booleana
  • Múltiples requestes de modificación2 usando Flowable en Kotlin
  • Traducir de Java a Kotlin OnClickListener
  • Use NumberFormat.getCurrency en Kotlin Android
  • Cadena para duplicar en Android / Kotlin