首页 > 解决方案 > 为什么将 Object 数组强制转换为泛型数组是合法的?

问题描述

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

我尝试了几件事:

整个 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 约定,我只是在试验:)

标签: javaarraysgenericscasting

解决方案


因为类型 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[].


推荐阅读