Kotlin泛型中列表和可变列表的区别

Kotlin泛型中列表和可变列表的区别,kotlin,generics,mutablelist,Kotlin,Generics,Mutablelist,我最近研究了kotlin泛型,但我发现了一些奇怪的现象 接口MyItem 有趣的项目(项目:列表?){ val castedItem=列表中的项目? } 有趣的bindItem2(项目:可变列表?){ val castedItem=项目作为可变列表? } 仅在可变列表情况下,编译器警告未选中强制转换 如果有人知道这种情况,请告诉我。列表界面具有声明站点协方差()。这意味着“向上转换”类型是安全的,因为列表只输出项目。例如,如果您有一个列表,则可以安全地将其用作列表,因为Int始终可以安全地转

我最近研究了kotlin泛型,但我发现了一些奇怪的现象

接口MyItem
有趣的项目(项目:列表?){
val castedItem=列表中的项目?
}
有趣的bindItem2(项目:可变列表?){
val castedItem=项目作为可变列表?
}
仅在可变列表情况下,编译器警告未选中强制转换


如果有人知道这种情况,请告诉我。

列表界面具有声明站点协方差(
)。这意味着“向上转换”类型是安全的,因为列表只输出项目。例如,如果您有一个
列表
,则可以安全地将其用作
列表
,因为
Int
始终可以安全地转换为
数字
。从列表中检索项目时,它们总是满足类型
Int
或超类型
Number
的要求

MutableList
没有协变类型。它在声明站点是不变的。这意味着“向上投射”其类型本身并不安全。例如,如果您将
MutableList
强制转换为
MutableList
,则使用
MutableList
引用是不安全的,因为它将允许您向列表中添加
Float
。当原始引用用作
MutableList
并尝试从中检索值时,它将获得一个ClassCastException,用于尝试将
浮点值
用作
Int

在这种情况下,您可以安全地将
MutableList
强制转换为协变类型,如下所示:

val castedItem = items as MutableList<out MyItem>?
val castedItem=项目作为可变列表?
但是具有协变类型的
可变列表
实际上与
列表
没有任何区别,因此最好将其转换为
列表
,以使意图更清晰

val castedItem = items as MutableList<out MyItem>?