오정환*_*오정환 2 generics kotlin mutablelist
我最近在研究 kotlin 泛型,但我发现了一些奇怪的情况
interface MyItem
fun <ITEM : MyItem> bindItem(items: List<ITEM>?) {
val castedItem = items as List<MyItem>?
}
fun <ITEM : MyItem> bindItem2(items: MutableList<ITEM>?) {
val castedItem = items as MutableList<MyItem>?
}
Run Code Online (Sandbox Code Playgroud)
只有在 MutableList 情况下,编译器才会警告未经检查的 Cast
如果有人知道这种情况,请告诉我。
该List接口具有声明站点协方差( <out T>)。这意味着“向上转换”类型是安全的,因为 List 只输出项目。例如,如果您有 a List<Int>,则将其用作 a 是安全的,List<Number>因为 anInt始终可以安全地转换为 a Number。当您从列表中检索项目时,它们总是满足作为 typeInt或 supertype 的要求Number。
MutableList没有协变类型。它在声明地点是不变的。这意味着“向上转换”其类型本质上并不安全。例如,如果您将MutableList<Int>a强制转换为 a MutableList<Number>,则使用该MutableList<Number>引用是不安全的 ,因为它会让您将 a 添加Float到列表中。当原始引用用作 aMutableList<Int>并尝试从中检索值时,它将收到 ClassCastException 以尝试将Float用作Int。
在这种情况下,您可以安全地将MutableList转换为协变类型,如下所示:
val castedItem = items as MutableList<out MyItem>?
Run Code Online (Sandbox Code Playgroud)
但是MutableList具有协变类型的a与 a 没有任何不同List,因此最好将其强制转换为 aList<MyItem>以使意图更清晰。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |