关于泛型数组的问题
请看一下下面这个例子:class Generic<T> {}
public class ArrayOfGeneric{
static final int SIZE = 100;
static Generic<Integer>[] gia;
@SuppressWarnings("unchecked")
public static void main(String[] args){
gia = (Generic<Integer>[])new Object[SIZE];
System.out.println(gia.getClass().getSimpleName());
gia[0] = new Generic<Integer>();
}
}
为什么在运行时因为这条语句:
gia = (Generic<Integer>[])new Object[SIZE];
报java.lang.ClassCastException的错误?
我的理解,在运行时,该语句擦除为:
gia = (Generic[])new Object[SIZE];
将Object[]数组转换为Generic[]数组,应该不会报一个运行时的异常的啊?
--------------------编程问答--------------------
你再想想,不会么?
--------------------编程问答-------------------- 你想把他爹变成儿子吗? --------------------编程问答-------------------- gia = (Generic<Integer>[])new Object[SIZE]; 这么写有什么用 --------------------编程问答-------------------- 楼主想干嘛呢 --------------------编程问答-------------------- top top top --------------------编程问答-------------------- 你想把他爹变成儿子吗? .....正解 --------------------编程问答--------------------
++ --------------------编程问答-------------------- 向下转型编译器会报警告,但是用下面的语句可以屏蔽
@SuppressWarnings("unchecked")
继续问题,看下面这段代码:
看似同样的代码结构 array = (T[]) new Object[sz];
为什么这条语句在运行时没有报java.lang.ClassCastException的错误;JVM在对两种类型的泛型数组处理时有何不同? --------------------编程问答--------------------
不一样,你那个擦除以后是
gia = (Generic[])new Object[SIZE];
而这个擦除以后是
array = (Object[]) new Object[sz];
--------------------编程问答-------------------- 你想把他爹变成儿子吗? .....精辟 --------------------编程问答--------------------
Java 语言中的数组是协变的(covariant),也就是说,如果 Integer扩展了 Number(事实也是如此),那么不仅 Integer是 Number,而且 Integer[]也是 Number[],在要求 Number[]的地方完全可以传递或者赋予 Integer[]。(更正式地说,如果 Number是 Integer的超类型,那么 Number[]也是 Integer[]的超类型)
http://www.cnblogs.com/ymind/archive/2012/04/21/2464505.html
按照这个说法擦除了反而是可以的。。。。泛型就是乱七八糟的。。。
理由这个可能更好(假如可以强转的话,再强转回去变成Object,放一个其他类型的值,而泛型是不能协变的):
1 List<String>[] lsa = new List<String>[10]; // illegal
2 Object[] oa = lsa; // OK because List<String> is a subtype of Object
3 List<Integer> li = new ArrayList<Integer>();
4 li.add(new Integer(3));
5 oa[0] = li;
6 String s = lsa[0].get(0); --------------------编程问答--------------------
恩,数组是covariant这没错,但是楼主的情况是 Object[] 要强转 Generic[],当然是会抛出 ClassCastException。
补充:Java , Java SE