将Object []转换为java中的引用类型数组

dam*_*mon 6 java arrays generics classcastexception

在通用堆栈的实现中,使用以下习语并且没有任何问题

public class GenericStack<Item> {
    private int N;
    private Item[] data;    

    public GenericStack(int sz) {
        super();
        data = (Item[]) new Object[sz];

    }
        ...
}
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试以下操作时,它会导致ClassCastException

String[] stra = (String[]) new Object[4];

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
Run Code Online (Sandbox Code Playgroud)

你怎么解释这个?

Pau*_*ora 3

将 a 转换new Object[4]为 aString[]不起作用,因为 anObject[]不是 a ,就像 an不是 aString[]一样。ObjectString

第一个示例之所以有效,是因为类型擦除。在运行时,类型参数Item已被删除为Object. 但是,如果您尝试将数组分配给可具体化的类型,例如如果data不是private

String[] strings = new GenericStack<String>(42).data;
Run Code Online (Sandbox Code Playgroud)

这同样会抛出 a ClassCastException,因为实际上 anObject[]会被转换为String[]