为什么将List <out x =“”>强制转换为List <x>

时间:2018-07-05 10:15:59

标签: kotlin

假设我们有以下列表:

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

结果是我们发出警告Unchecked cast: MutableList<out X> to MutableList<X>

为什么在这种情况下强制转换很危险?

1 个答案:

答案 0 :(得分:4)

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
}