gpt4 book ai didi

java - 通过类型删除来欺骗集合

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

我试图通过说明类型删除来向某人解释它,但我发现了一些意想不到的东西。这是我尝试过的片段:

Object o = new ArrayList<Integer>();
List<String> list = (List<String>) o;
list.add("Oups");
System.out.println(list);

我原以为这会在最后一行抛出 ClassCastException (或类似的内容),但事实并非如此。我还尝试在转换为 Object 之前用整数值填充 ArrayList,结果是相同的。

为什么这与

不同
Integer[] arr0 = { 1,2,3,4 };
Object[] arr1 = arr0;
arr1[3] = "hey";

哪个抛出异常 (ArrayStoreException)?

最佳答案

(因问题更改而更新。)

最后一行不会抛出异常,只是因为 ArrayListtoString() 实现根本不关心元素类型。简而言之,它对存储在其内部 Object[] 元素数组中的每个对象递归调用 toString(),因此无需检查其运行时类型元素。

但是,这段代码实际上也不会失败:

List<Integer> il = new ArrayList<Integer>();
Object o = il;
List<String> sl = (List<String>)o;
sl.add("Oups");
System.out.println(il.get(0));

这是因为 System.out.println 的参数类型是 Object,因此编译器优化了对 Integer 的隐式转换在 get() 点,因为它并不是严格意义上的“必要”。人们可能会或可能不会争论这对编译器来说是不好的,因为早期的转换会更早地检测到错误,但事实就是如此。

另一方面,用此替换最后一行抛出异常:

System.out.println(il.get(0) + 5);

因为现在您正在执行一个操作,该操作假定元素为Integer,并且转换包含在生成的代码中。

另一方面,原始数组具有其元素类型的运行时知识,并将在每次插入时断言它。

关于java - 通过类型删除来欺骗集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28006322/

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