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()
我知道这似乎是一个重复的问题,但我对不变性、协变性和逆变性的工作原理感到困惑。
我不明白为什么我不能编译这个片段:
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()