解释为什么显示Warning Unchecked cast source.readArrayList(data !!。javaClass.classLoader)as ArrayList <data>?

时间:2017-06-22 11:22:44

标签: arraylist kotlin

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

警告未经检查的强制转换:ArrayList&lt;(raw)Any!&gt;!到ArrayList? coustom数据类的数据

1 个答案:

答案 0 :(得分:4)

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

val s: String = f() as String

在结果字节码中将有checkcast条指令:

checkcast java/lang/String

这是运行时检查,以查看f()的结果是否实际为String

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

所以VM最好能做的就是检查你输出的值是ArrayList?,但它无法检查它是否真的是ArrrayList<Data>?,这就是为什么要调用强制转换的原因未选中。

所以:

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

你会得到:

checkcast java/util/List

请注意String如何丢失。

但是,这并不意味着VM会盲目地将您从列表中获取的任何值视为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