¿Cómo crear una list inmutable en Kotlin que también sea una list inmutable en Java?

Tengo un problema de interoperabilidad Java / Kotlin. ¡Una list inmutable de Kotlin se comstack en una java.util.ArrayList normal que es mutable!

Kotlin (biblioteca):

class A { val items: List<Item> = ArrayList() } 

Java (consumidor):

 A a = new A(); a.getItems().add(new Item()); // Compiles and runs but I wish to fail or throw 

¿Cómo hacer que mi class de Kotlin sea completamente inmutable desde la perspectiva de Java también?

Todas las collections que no son Mutable____ en Kotlin son de time de compilation de solo lectura por defecto, pero no son inmutables . Vea el siguiente fragment de código:

 fun main(args: Array<String>) { // Explanation for ArrayList(listOf()) later down the post val list: List<Int> = ArrayList(listOf(1, 2, 3)) println(list) // [1, 2, 3] // Fails at compile time // list.add(4) // Uh oh! This works at runtime! (list as MutableList<Int>).add(4) println(list) // [1, 2, 3, 4] } 

Para tener verdaderamente una list inmutable, considere las collections Immutable____ de Guava:

 import com.google.common.collect.ImmutableList fun main(args: Array<String>) { val list: List<Int> = ImmutableList.of(1, 2, 3) println(list) // [1, 2, 3] // Fails at compile time // list.add(4) // Fails at runtime, as expected (list as MutableList<Int>).add(4) println(list) // [1, 2, 3, 4] } 

Tenga en count que algunas de las funciones de time de ejecución estándar de Kotlin pueden devolver collections que no se pueden modificar, no se pueden cambiar de tamaño, etc., por lo que todas las apuestas se desactivan cuando transfiere directamente una colección de solo lectura a una mutable.

Por ejemplo, listOf() actualmente ( esto puede cambiar en el futuro ) devuelve un java.util.Arrays.ArrayList alnetworkingedor de la matriz de parameters Arrays.asList(T...) través de Arrays.asList(T...) . Esta "list" se puede modificar, pero los elementos nunca se pueden agregar o eliminar, ya que no se puede cambiar el tamaño de una matriz. Ver Arrays.asList(T...) javadoc para más información.

Si realmente desea una colección mutable de cualquier colección dada, considere hacer una copy usando .toMutableList() . Esto funcionará en cualquier colección:

 import com.google.common.collect.ImmutableList fun main(args: Array<String>) { val list: List<Int> = ImmutableList.of(1, 2, 3) val copy = list.toMutableList() copy.add(4) println(copy) // [1, 2, 3, 4] println(list) // [1, 2, 3] } 
  • ¿Tiene Kotlin una function de "enumerar" como Python?
  • Filtro de list dentro del range externo - KOTLIN
  • Lista de sorting basada en el order de otra list
  • Ordenar datos de una MutableList en Kotlin