如何在Kotlin中创建一个在Java中也是不可变列表的不可变列表?
我有一个Java/Kotlin互操作问题。Kotlin不可变列表被编译成一个普通的java.util.ArrayList,它是可变的 科特林(图书馆):如何在Kotlin中创建一个在Java中也是不可变列表的不可变列表?,java,immutability,kotlin,immutablelist,Java,Immutability,Kotlin,Immutablelist,我有一个Java/Kotlin互操作问题。Kotlin不可变列表被编译成一个普通的java.util.ArrayList,它是可变的 科特林(图书馆): 如何使我的Kotlin类也从Java角度完全不可变?Kotlin中的所有非可变的集合默认为编译时只读类型,但不是不可变的。请参阅以下代码段: fun main(args: Array<String>) { // Explanation for ArrayList(listOf()) later down the post v
如何使我的Kotlin类也从Java角度完全不可变?Kotlin中的所有非
可变的
集合默认为编译时只读类型,但不是不可变的。请参阅以下代码段:
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]
}
请注意,Kotlin的一些标准运行时函数可能返回不可修改、不可调整大小等的集合,因此当您直接将只读集合转换为可变集合时,所有赌注都将被取消
例如,listOf()
当前(将来可能会更改!)通过Arrays.asList(T..)
在vararg参数数组周围返回java.util.Arrays.ArrayList
。此“列表”可以修改,但不能添加或删除元素,因为无法调整数组的大小。有关更多信息,请参阅
如果你真的想要任何给定集合中的一个可变集合,考虑使用<代码> .Tututabelist]()/代码>进行复制。这将适用于任何集合:
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]
}
import com.google.common.collect.ImmutableList
趣味主线(args:Array){
val list:list=ImmutableList.of(1,2,3)
val copy=list.toMutableList()
复制。添加(4)
println(副本)/[1,2,3,4]
println(列表)/[1,2,3]
}
有一个不可变列表。copyOf(list)
返回一个不可变列表
。
这是Kotlin API,您将无法在Java中使用它
另一个选项是Collections.unmodifiableList
fromjava.util
,当在Kotlin中使用时,它返回一个可变列表类型,但就像在java中一样,如果您尝试修改它,您将得到一个异常。我不熟悉Kotlin,但是guava Java库有一个ImmutableList
类型,您可以使用它包装可变ArrayList
。不可修改列表(ArrayList())可以工作。请将其作为答案发布。必须避免在Android上复制番石榴<代码>集合。不可修改列表()
是最安全和最简单的解决方案。@WindRider但建议使用ProGuard。stdlib中是否仍存在此选项?
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]
}
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]
}
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]
}