Kotlin 泛型 class 属性

Kotlin generic class property

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

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

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

    fun putList(){
        list2 = emptyList()
        list1 = emptyList<Any>()
    }
}

我收到类型不匹配错误 Required X found List

但是,如果我将 X 泛型定义为 'out',我将收到一条错误消息,指出参数 X 在 list1 var.

中是不变的

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

简短回答:var list1 是协变的,您正试图以逆变方式使用它。

您目前正在尝试做的事情:将超类型的实例(由上限指定)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()