generics - Kotlin 泛型类属性

标签 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 泛型定义为“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/

相关文章:

c# - 为什么我们不能在非泛型类中拥有泛型方法?

java - 在泛型类中使用泛型对象方法

Swift (4) 无法转换为泛型基类?

c++ - 虚函数与其覆盖的函数的返回类型不协变

c# - 泛型协变和显式转换

c# - 在返回派生类型的派生接口(interface)中隐藏属性是否可以接受?

java - 通用类型 x 通用参数 : Building a "very generic" structure

android - 使用 Dagger2 的多模块 android 应用程序,在功能模块中不使用 `kapt`

android - 如何在 Android 中使用 ViewBinding 为 ViewStub 充气

kotlin - 从 Java 返回的 null 在 Kotlin 测试中的比较失败