如何在Kotlin中创建一个也是Java中不可变列表的不可变列表?

我有一个Java / Kotlin互操作问题。 一个Kotlin不可变列表被编译成一个可变的正常的java.util.ArrayList!

Kotlin(图书馆):

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

Java(消费者):

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

如何使我的Kotlin类从Java的角度来看完全不可变?

Kotlin中的所有非Mutable____集合都是编译时只读类型 ,但不是不可变的 。 看下面的代码片段:

 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] } 

要真正拥有一个不变的名单,考虑番石榴的Immutable____收藏:

 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] } 

请注意,某些Kotlin的标准运行时函数可能会返回不可修改,不可调整大小等的集合,因此当您将只读集合直接转换为可变集合时,所有投注都将关闭。

例如,当前的listOf()将来可能会改变! )通过Arrays.asList(T...)返回一个java.util.Arrays.ArrayList ,该Arrays.asList(T...)包含可变参数数组。 这个“列表”可以被修改,但是元素不能被添加或删除,因为你不能调整数组的大小。 有关更多信息,请参阅Arrays.asList(T...) javadoc 。

如果您真的想从任何给定的集合中获取可变集合,请考虑使用.toMutableList()进行复制。 这将适用于任何集合:

 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] }