0

你能举一个例子来说明这个引用:

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

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

4

2 回答 2

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)
}
于 2019-05-21T06:52:52.743 回答
0

要回答这部分:

你能举一个例子来说明这个引用:

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

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

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

即使listhas typeList<Int>和 not MutableList<Int>,它的内容也发生了变化。

请注意,这是一个示例

我想编写一个将元素添加到某个集合的函数,同时val someCollection: List <>在有趣的 main() 中创建一个。

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

于 2019-05-21T10:11:23.537 回答