Kotlin List и MutableList: две разные ссылки, указывающие на один и тот же объект коллекции - PullRequest
0 голосов
/ 21 мая 2019

Не могли бы вы привести пример этой цитаты:

При работе с интерфейсами коллекций следует иметь в виду, что коллекции только для чтения не обязательно являются неизменяемыми. Если вы работаете с переменной, имеющей тип интерфейса только для чтения, это может быть лишь одна из множества ссылок на одну и ту же коллекцию. Другие ссылки могут иметь изменяемый тип интерфейса

Я хочу написать функцию, которая добавляет элементы в некоторую коллекцию при создании val someCollection: List <> в забавной функции main (). Я могу сделать это через 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 или нет?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Вот несколько способов переписать ваш код без использования 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)
}
0 голосов
/ 21 мая 2019

Чтобы ответить на эту часть:

Не могли бы вы привести пример этой цитаты:

При работе с интерфейсами коллекций следует иметь в виду, что коллекции только для чтения не обязательно являются неизменяемыми. Если вы работаете с переменной, имеющей тип интерфейса только для чтения, это может быть лишь одна из множества ссылок на одну и ту же коллекцию. Другие ссылки могут иметь изменяемый тип интерфейса

Это просто говорит о таких ситуациях:

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

Даже если list имеет тип List<Int>, а не MutableList<Int>, его содержимое изменилось.

Обратите внимание, что это пример

Я хочу написать функцию, которая добавляет элементы в некоторую коллекцию, создавая val someCollection: List <> в забавной функции main ().

также, но я бы не рекомендовал писать этот код; перейти с одной из версий JB Nizet.

...