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)
你怎么解释这个?
将 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[]。