Kotlin List и MutableList: две разные ссылки, указывающие на один и тот же объект коллекции
Не могли бы вы привести пример этой цитаты:
При работе с интерфейсами коллекций следует иметь в виду, что коллекции только для чтения не обязательно являются неизменяемыми. Если вы работаете с переменной, имеющей тип интерфейса только для чтения, это может быть только одна из множества ссылок на одну и ту же коллекцию. Другие ссылки могут иметь изменяемый тип интерфейса
Я хочу написать функцию, которая добавляет элементы в некоторую коллекцию при создании 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 ответа
Вот несколько способов переписать ваш код без использования 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)
}
Чтобы ответить на эту часть:
Не могли бы вы привести пример этой цитаты:
При работе с интерфейсами коллекций следует иметь в виду, что коллекции только для чтения не обязательно являются неизменяемыми. Если вы работаете с переменной, имеющей тип интерфейса только для чтения, это может быть только одна из множества ссылок на одну и ту же коллекцию. Другие ссылки могут иметь изменяемый тип интерфейса
Это просто говорит о таких ситуациях:
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 <>
в главном веселье ().
также, но я бы не рекомендовал писать этот код; перейти с одной из версий JB Nizet.