假设我们有以下列表:
val list: MutableList<out X> = mutableListOf(...)
val list2 = list as MutableList<X>
结果是我们发出警告Unchecked cast: MutableList<out X> to MutableList<X>
为什么在这种情况下强制转换很危险?
答案 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
}