Почему опасно преобразовывать Список <из X> в Список <X> - PullRequest
0 голосов
/ 05 июля 2018

Допустим, у нас есть список:

val list: MutableList<out X> = mutableListOf(...)
val list2 = list as MutableList<X>

В результате мы получаем предупреждение Unchecked cast: MutableList<out X> to MutableList<X>

Почему этот бросок опасен в этом случае?

1 Ответ

0 голосов
/ 05 июля 2018

MutableList<out X> - это список, который содержит элементы определенного типа, которые являются подклассом X. Приведя его к MutableList<X>, вы также разрешаете добавлять другие элементы в этот список, которые также имеют тип X но не того же самого подкласса. Например:

class StringHolder {
    val strings = ArrayList<String>()
    val list: MutableList<out Any> = strings
    fun process() {
        for (s in strings) {
            s.length
        }
    }
}

fun hack(holder: StringHolder) {
    val list = holder.list as MutableList<Any>
    list.add(1)
    holder.process() // fails with ClassCastException casting Int to String
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...