gpt4 book ai didi

java - 为什么将对象数组转换为泛型数组是合法的?

转载 作者:行者123 更新时间:2023-11-30 01:46:22 24 4
gpt4 key购买 nike

当我尝试将对象数组转换为自定义数据类型(类)数组时,出现 ClassCastException,但是当我将对象数组转换为泛型数组时,没有观察到此类错误;此外,如果我传递自定义数据类型(类)作为类型参数,则也不会抛出 ClassCastException。

我尝试了几件事:

  • 首先,我创建了一个名为 TestClass 的自定义数据类型。然后我尝试创建一个对象数组并将其转换为 TestClass TestClass[] 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 约定,我只是在尝试:)

最佳答案

因为type erasure : Item 被删除为 Object,所以你的代码变成了

public class Main {
Object a[];

...
this.a = (Object[]) new Object[100];
...
}

毫不奇怪, Actor 阵容成功了。

现在,如果您添加例如

TestClass[] b = m.a;

main,编译器需要插入一个强制转换

TestClass[] b = (TestClass[]) m.a;

并且将会失败,因为m.a实际上是一个Object[]

关于java - 为什么将对象数组转换为泛型数组是合法的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57795472/

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