日期:2014-05-20  浏览次数:20774 次

关于《think in java》中的泛型数组(关于擦除的问题) 求大牛指教!!!
object数组到参数化类型的转型将在编译期产生警告,运行时产生异常 但是为什么java类库确有很多这个用法,而且没有任何运行时异常????
请看下面一个例子:
public class GenericArray<T> {

private T[] arry;
public GenericArray(int size){
arry=(T[])new Object[size];
}
public void put(int index,T item){
arry[index]=item;
}
public T get(int index) {return arry[index];}
public T[] rep(){return arry;}
public static void main(String[] args) {
GenericArray<Integer> gai=new GenericArray<Integer>(10);
Integer[] ia=gai.rep();
//Object [] oa=gai.rep();

}

}
编译没有任何问题,但运行时会有:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.Integer;
at GenericArray.main(GenericArray.java:15)
我知道,这里有个檫除的问题,构造函数
public GenericArray(int size){
arry=(T[])new Object[size];
}
这里返回的其实应该是object类型,但是如果我把main函数里这一句:
Integer[] ia=gai.rep();改成Integer[] ia=(Integer[])gai.rep();还是一样出错!!!!

Object是所有类的父类,我把Object类向下转型有什么不可以?!!!这种方式在java类库中应该很多啊.....


------解决方案--------------------
向下转型的前提是:该对象本来就是那个类型的,只是引用变量是父类型。

比如:
Object[] objs = new Integer[10]; // 本来它就是Integer型数组
Integer[] as = (Integer[]) objs; // 恢复庐山真面目

你这种定义是不行的:
Object[] objs = new Object()[10]; // 本来它就是个Object数组
Integer[] as = (Integer[]) objs; // 没啥好恢复的了


我想你可能理解错了Java类库中的用法,这个是可以的:
objs[0] = new Integer(1); // 用Object变量保存了Integer实例
Integer a = (Integer) objs[0]; // 恢复庐山真面目