Kotlin通用类属性

时间:2018-03-28 18:06:40

标签: 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>()
    }
}

我收到类型不匹配错误必需的X找到列表

但是,如果我将X泛型定义为&#39; out&#39;我将得到一个错误,指示参数X在list1 var。

中是不变的

有人可以帮助另一个可怜的灵魂在Kotlin仿制药中迷失吗?

1 个答案:

答案 0 :(得分:1)

简短回答:变量postroll是协变的,你试图以逆变的方式使用它。

您当前要做的事情:将超类型的实例(由上限指定)list1分配给其子类型List<Any>的变量,即{{1} }。要简化问题,请考虑以下事项:

X

您根本无法将对象分配给该对象的子类型的变量。另一种方式是好的:list1