如何在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] }