arraylist - 解释一下为什么显示警告未选中强制转换source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?

标签 arraylist kotlin

 this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?

警告未经检查的强制转换:ArrayList<(raw) Any!>!到数组列表? 自定义数据类的数据

最佳答案

通常,当您进行强制转换时,编译器会插入运行时检查以查看此强制转换是否有效。例如:

val s: String = f() as String

将会有一个checkcast生成的字节码中的指令:

checkcast java/lang/String

这是一个运行时检查,以查看 f() 的结果是否正确。实际上是一个String .

但是由于泛型被删除,ArrayList<Data>?只是 ArrayList?在运行时。

因此,虚拟机能做的最好的事情就是检查您正在转换的值是否为 ArrayList? ,但它无法检查它是否实际上是 ArrrayList<Data>? ,这就是为什么 Actor 被称为“未经检查”。

所以对于:

val a: List<String> = f() as List<String>

您将得到:

checkcast java/util/List

注意这里如何String丢失了。

但是,这并不意味着虚拟机会盲目地将您从列表中获取的任何值视为 String ,通常只是意味着强制转换为 String发生在其他地方。例如,当您从列表中删除某些内容时:

val s: String = a[0]

这变成:

iconst_0
invokeinterface java/util/List.get:(I)Ljava/lang/Object;
checkcast java/lang/String

注意有一个 checkcastString 。该转换由编译器隐式插入,就好像代码实际上是:

val s: String = a[0] as String

关于arraylist - 解释一下为什么显示警告未选中强制转换source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44697961/

相关文章:

java - 获取数组列表中项目的索引;

java - ArrayList<Integer> 的内存使用情况

unit-testing - 为什么 "getSharedPreferences"在单元测试中返回null?

java - 逐行读取一个.txt文件到ArrayList

java - 根据排序从 Arraylist 中删除对象

java - 迭代 fastutil 原始 ArrayList 的最佳实践,例如整数数组列表?

sorting - 如何使用自定义顺序对 kotlin 中的对象数组进行排序?

java - 华为Map Kit Activity打开很慢

android - Kotlin 和 Android 数据绑定(bind)

java - 重写 Kotlin 的属性 setter 会导致两个 JPA @Id