java - 为什么将 Object 数组强制转换为泛型数组是合法的?
问题描述
当我尝试将对象数组转换为自定义数据类型(类)数组时,我得到 ClassCastException 但是当我将对象数组转换为泛型数组时,没有观察到此类错误;此外,如果我将自定义数据类型(类)作为类型参数传递,则也不会抛出 ClassCastException。
我尝试了几件事:
- 首先,我创建了一个名为
TestClass
. 然后我尝试创建一个对象数组并将其转换为 TestClassTestClass[] b = (TestClass[]) new Object[100];
- 结果:ClassCastException
- 我使 Main 类(其 main() 函数进行实验)接受类型参数(泛型),称为
Item
. 接下来是一行代码this.a = (Item[]) new Object[100];
,其中a
一个实例变量定义为Item[] a
.- 结果:退出代码 0
main(String[] args)
现在,我在:中添加了一行代码,Main<TestClass> m = new Main<TestClass>();
请注意我TestClass
作为类型参数传递,因此在构造函数中我们面临的情况与第一个实验设置中的情况几乎相同,因此我期望ClassCastException
.- 结果:存在代码 0
整个 Main 类供进一步参考(假设TestClass
已定义):
public class Main<Item>{
Item a[];
TestClass b[];
public Main(){
//this.b = (TestClass[]) new Object[100]; (errors disappear when this line is commented out, otherwise ClassCastException is thrown)
this.a = (Item[]) new Object[100];
}
public void doStuff(){
System.out.println(Arrays.toString(this.a));
System.out.println(Arrays.toString(this.b));
}
public static void main(String[] args) {
Object a = new Object();
Main<TestClass> m = new Main<TestClass>(); //TestClass passed as type argument, should cause problems in the constructor
m.doStuff();
}
抱歉没有使用正确的 Java 约定,我只是在试验:)
解决方案
因为类型 erasure :Item
被擦除到Object
,所以你的代码变成
public class Main {
Object a[];
...
this.a = (Object[]) new Object[100];
...
}
不出所料,演员阵容成功了。
现在,如果您添加例如
TestClass[] b = m.a;
to main
,编译器将需要插入一个强制转换
TestClass[] b = (TestClass[]) m.a;
这将失败,因为它m.a
确实是一个Object[]
.
推荐阅读
- r - 使用 rmse 的神经网络性能
- wordpress - 每当订单超过 500 美元时,如何在 WooCommerce 中发送电子邮件提醒?
- python - 在以列表为值的字典中查找键(Python)
- javascript - 将thingspeak中的JSON显示为HTML
- excel - 打开工作簿并复制信息代码不会按预期复制值
- matlab - MATLAB 中使用 dec2bin 的二进制表示问题
- python - 执行 bash 脚本时网络无法访问
- r - 如何解析化学式以获得原子成分?
- flutter - 有没有办法改变光标在文本字段中的起始位置?扑
- reactjs - 如何将变量从 childComponent 获取到 ParentComponent ReactJS