【发布时间】:2013-06-11 02:31:25
【问题描述】:
在通用堆栈的实现中,使用以下成语并且没有任何问题
public class GenericStack<Item> {
private int N;
private Item[] data;
public GenericStack(int sz) {
super();
data = (Item[]) new Object[sz];
}
...
}
但是,当我尝试以下操作时,它会导致 ClassCastException
String[] stra = (String[]) new Object[4];
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
你怎么解释这个?
【问题讨论】:
-
String 不继承自 Item,因此无法进行强制转换。
-
@Piovezan
String和Item不在同一行。 -
new GenericStack<String>(10)有效,但如果您尝试String[] stra = new GenericStack<String>(10).getData();(实现相应的 getter),则会因 ClassCastException 而失败。所以它并没有“真正”起作用,演员阵容并没有神奇地完成。 -
也就是说,您仍然可以使用
Array.newInstance(Class clazz, Integer)来一般地创建您的数组。示例Array.newInstance(String.class, sz). -
Item 不是一个类,它只是泛型类型名称。泛型以这种方式非常具体。如果你想回答这个问题,如果我是你,我会专注于找出泛型类型何时被实际类型替换。肯定不是编译时间
标签: java arrays generics classcastexception