this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?
警告未经检查的强制转换:ArrayList&lt;(raw)Any!&gt;!到ArrayList? coustom数据类的数据
答案 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
请注意checkcast
到String
的方式。该编译器由编译器隐式插入,就好像代码实际上是:
val s: String = a[0] as String