当前位置:编程学习 > JAVA >>

关于泛型数组的问题

请看一下下面这个例子:
 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[]数组,应该不会报一个运行时的异常的啊?
  --------------------编程问答--------------------
引用 楼主 goldenguozhu 的回复:
将Object[]数组转换为Generic[]数组,应该不会报一个运行时的异常的啊?




你再想想,不会么?
--------------------编程问答-------------------- 你想把他爹变成儿子吗? --------------------编程问答--------------------  gia = (Generic<Integer>[])new Object[SIZE]; 这么写有什么用 --------------------编程问答-------------------- 楼主想干嘛呢 --------------------编程问答-------------------- top top top --------------------编程问答-------------------- 你想把他爹变成儿子吗? .....正解 --------------------编程问答--------------------
引用 3 楼 zqfddqr 的回复:
gia = (Generic<Integer>[])new Object[SIZE]; 这么写有什么用


++ --------------------编程问答-------------------- 向下转型编译器会报警告,但是用下面的语句可以屏蔽
@SuppressWarnings("unchecked")
继续问题,看下面这段代码:


看似同样的代码结构 array = (T[]) new Object[sz];
为什么这条语句在运行时没有报java.lang.ClassCastException的错误;JVM在对两种类型的泛型数组处理时有何不同? --------------------编程问答--------------------
引用 8 楼 goldenguozhu 的回复:
看似同样的代码结构 array = (T[]) new Object[sz];


不一样,你那个擦除以后是 
gia = (Generic[])new Object[SIZE]; 

而这个擦除以后是
array = (Object[]) new Object[sz];
--------------------编程问答-------------------- 你想把他爹变成儿子吗? .....精辟 --------------------编程问答--------------------
引用 9 楼 raistlic 的回复:
引用 8 楼 goldenguozhu 的回复:看似同样的代码结构 array = (T[]) new Object[sz];

不一样,你那个擦除以后是 
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); --------------------编程问答--------------------
引用 11 楼 mingzidaodiduochang 的回复:
引用 9 楼 raistlic 的回复:引用 8 楼 goldenguozhu 的回复:看似同样的代码结构 array = (T[]) new Object[sz];

不一样,你那个擦除以后是 
gia = (Generic[])new Object[SIZE]; 

而这个擦除以后是
array = (Object[]) new Object[sz];
……


恩,数组是covariant这没错,但是楼主的情况是 Object[] 要强转 Generic[],当然是会抛出 ClassCastException。
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,