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