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

时间:2019-05-21 06:13:46

标签: list kotlin mutablelist

您能举一个例子吗?

使用集合接口时要记住的一件事是只读集合不一定是不变的。如果您使用的是具有只读接口类型的变量,则该变量可能只是对同一集合的众多引用之一。其他引用可以具有可变的接口类型

我想编写一个函数,将元素添加到某个集合中,同时创建一个有趣的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和reassigment readOnlyNumbers?

2 个答案:

答案 0 :(得分:1)

有多种不用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)
}

答案 1 :(得分:0)

要回答这一部分:

  

您能举一个例子吗?

     
    

使用集合接口时要记住的一件事是只读集合不一定是不变的。如果您使用的是具有只读接口类型的变量,则该变量可能只是对同一集合的众多引用之一。其他引用可以具有可变的接口类型

  

这只是在谈论这样的情况:

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

即使list的类型为List<Int>而不是MutableList<Int>,其内容也已更改。

请注意,这是一个示例

  

我想编写一个在一些元素上添加元素的函数,同时在有趣的main()中创建一个val someCollection: List <>

也一样,但我不建议编写此代码;搭配JB Nizet的版本之一。