2

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

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

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 泛型中的可怜的灵魂吗?

4

1 回答 1

1

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

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

于 2018-03-28T18:27:22.123 回答