我知道这似乎是一个重复的问题,但我对不变性、协变和逆变如何工作感到困惑。
我不明白为什么我不能编译这个片段:
class Test<X: List<Any>>{
lateinit var list2:List<Any>
lateinit var list1:X
fun putList(){
list2 = emptyList()
list1 = emptyList<Any>()
}
}
我收到类型不匹配错误 需要 X 找到列表
但是,如果我将 X 泛型定义为“out”,我将收到一个错误,表明参数 X 在 list1 var 中是不变的。
有人可以帮助另一个迷失在 Kotlin 泛型中的可怜的灵魂吗?
最佳答案
简短的回答:var list1
是协变的,你试图以逆变的方式使用它。
您当前正在尝试做的事情:分配一个父类(super class)型的实例(由上限指定)List<Any>
到其子类型的变量X
,即 list1
.为了简化问题,请考虑以下问题:
open class Super
class Sub : Super()
val sub: Sub = Super() //Compile Error: Type mismatch: inferred type is Super but Sub was expected
您根本无法将对象分配给该对象的子类型的变量。不过反过来也可以:
val sup: Super = Sub()
关于generics - Kotlin 泛型类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49541355/