gpt4 book ai didi

arraylist - 解释为什么将警告未经检查的强制转换source.readArrayList(data !!。javaClass.classLoader)显示为ArrayList

转载 作者:行者123 更新时间:2023-12-02 12:39:25 24 4
gpt4 key购买 nike

 this.data = source.readArrayList(data!!.javaClass.classLoader) as ArrayList<Data>?
警告未经检查的 Actor :ArrayList <(raw)Any!>!到ArrayList?
自定义数据类的数据

最佳答案

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com