Почему я могу создать MutableList как val в Kotlin (а ​​также добавить к нему элементы)? - PullRequest
0 голосов
/ 16 февраля 2019

Я только начинаю изучать Kotlin, поэтому я сыграл видео, которое показывает многие из распространенных идиом Kotlin: Учебник Kotlin

Только в 1:03:10 пунктов в видео, ведущий обсуждает изменчивые и неизменные коллекции.Как вы можете видеть на видео, он создает MutableList с ключевым словом var и неизменный List с ключевым словом val.Мне было любопытно посмотреть, какая ошибка возникнет, если я попытаюсь использовать val с MutableList;Я предполагал, что это будет недопустимо, и что IDEA будет отображать сообщение об этом, но это не дало мне сообщения об ошибке.Затем я добавил элемент в MutableList, и это тоже не вызвало ошибки!Когда я отображал последний элемент MutableList, он отображал элемент, который я добавил, поэтому он не только не смог выдать ошибку, но и успешно добавил элемент к чему-то, что я считал неизменным.

Почему мой код работает?Я не могу поверить, что такой новичок в Kotlin, как я, обнаружил фундаментальную ошибку в Kotlin, поэтому должно быть что-то еще.Может кто-нибудь объяснить?

Вот мой код:

val list3: MutableList<Int> = mutableListOf(6,7,8) 
list3.add(5)
println("list3 last item: ${list3.last()}")

Оператор println () отображает:

list3 last item: 5

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

val означает значение, поэтому вы можете присвоить это val объекту только один раз, это то же самое, что ключевое слово final в Java.Когда вы попытаетесь переназначить val еще раз, произойдет ошибка.

    val list3: MutableList<Int> = mutableListOf(6,7,8) 
    list3.add(5)
    println("list3 last item: ${list3.last()}")

в приведенном выше примере вы не присваивали list3 новый объект, вместо этого вы просто мутировали / добавлялиновое значение списка.

    val list3: MutableList<Int> = mutableListOf(6,7,8) 
    list3 = mutableListOf(1,2,3)

в приведенном выше примере произойдет ошибка, потому что мы пытаемся присвоить list3 новый экземпляр mutableList

Надеюсь, это поможет

0 голосов
/ 16 февраля 2019

val только означает, что сама переменная не может быть переназначена.Он ничего не говорит о том, что объект в этой переменной изменчивый или нет.

Вы получите сообщение об ошибке, если попытаетесь выполнить

 val list3: MutableList<Int> = mutableListOf(6,7,8)
 list3 = mutableListOf(1,2,3)   // cannot re-assign to val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...