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
注意有一个 checkcast
至String
。该转换由编译器隐式插入,就好像代码实际上是:
val s: String = a[0] as String
关于arraylist - 解释一下为什么显示警告未选中强制转换source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44697961/