Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Kotlin中创建一个在Java中也是不可变列表的不可变列表?_Java_Immutability_Kotlin_Immutablelist - Fatal编程技术网

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

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

我有一个Java/Kotlin互操作问题。Kotlin不可变列表被编译成一个普通的java.util.ArrayList,它是可变的

科特林(图书馆):


如何使我的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
from
java.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]
}