Kotlin List 和 MutableList:两个不同的引用,指向同一个集合对象

Kotlin List and MutableList: two different references, pointed to the same collection object

你能给这个引文举个例子吗:

使用集合接口时要牢记的一个关键事项是只读集合不一定是不可变的。如果您正在使用具有只读接口类型的变量,则这可能只是对同一集合的众多引用之一。其他引用可以具有可变接口类型

我想编写一个将元素添加到某个集合的函数,同时在有趣的 main() 中创建一个 val someCollection: List <>。我可以通过 var someCollection: List <> = funAdd(someCollection.toMutable) 来做到这一点,但是我可以在不使用变量 var 的情况下这样做吗?

例子

fun addEl(numbers:MutableList<Int>):List<Int>{
    for (i in 1..10){
        numbers.add(i)
    }
    return numbers.toList()
}

fun main(args: Array<String>){
    var readOnlyNumbers: List<Int> = emptyList()
    readOnlyNumbers = addEl(readOnlyNumbers.toMutableList())
    println(readOnlyNumbers.size)
}

我是否可以避免使用 var 和重新分配 readOnlyNumbers?

这里有多种不使用 var 重写代码的方法:

fun addEl(numbers:MutableList<Int>):List<Int>{
    for (i in 1..10) {
        numbers.add(i)
    }
    return numbers.toList()
}

fun main(args: Array<String>){
    val readOnlyNumbers: List<Int> = addEl(mutableListOf())
    println(readOnlyNumbers.size)
}

或者干脆

fun createEl(): List<Int> {
    return (1..10).toList()
}

fun main(args: Array<String>){
    val readOnlyNumbers = createEl()
    println(readOnlyNumbers.size)
}

回答这部分:

Could you give an example to this quotation:

A key thing to keep in mind when working with collection interfaces is that read-only collections aren’t necessarily immutable. If you’re working with a variable that has a read-only interface type, this can be just one of the many references to the same collection. Other references can have a mutable interface type

这里简单说一下这样的情况:

val mutableList: MutableList<Int> = mutableListOf<Int>()
val list: List<Int> = mutableList
println(list) // []
mutableList.add(0)
println(list) // [0]

尽管 list 的类型为 List<Int> 而不是 MutableList<Int>,但其内容已更改。

注意这是

的例子

I want to write a function that adds elements to some collection, while creating a val someCollection: List <> in the fun main().

也是,但我不建议编写此代码;使用 JB Nizet 的版本之一。