Generics Kotlin泛型类属性

Generics Kotlin泛型类属性,generics,kotlin,covariance,contravariance,invariance,Generics,Kotlin,Covariance,Contravariance,Invariance,我知道这似乎是一个重复的问题,但我对不变性、协变和逆变是如何工作的感到困惑 我不明白为什么我不能编译这个片段: class Test<X: List<Any>>{ lateinit var list2:List<Any> lateinit var list1:X fun putList(){ list2 = emptyList() list1 = emptyList<Any>() }

我知道这似乎是一个重复的问题,但我对不变性、协变和逆变是如何工作的感到困惑

我不明白为什么我不能编译这个片段:

class Test<X: List<Any>>{
    lateinit var list2:List<Any>
    lateinit var list1:X

    fun putList(){
        list2 = emptyList()
        list1 = emptyList<Any>()
    }
}
类测试{
lateinit var list2:列表
lateinit变量列表1:X
趣味putList(){
list2=emptyList()
list1=emptyList()
}
}
我得到类型不匹配错误所需的X查找列表

但是,如果我将X泛型定义为'out',我将得到一个错误,表明参数X在list1变量中是不变的


有人能帮助在Kotlin泛型中迷失的另一个可怜的灵魂吗?

简单的回答:var
list1
是协变的,你试图以一种逆变的方式使用它

您当前尝试执行的操作:将超级类型的实例(由上限指定)
List
分配给其子类型
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()

是的。我假设列表是它自己的一个子类型,我可以分配像MutableList和它自己这样的子类型。。。谢谢