解决方案 »

  1.   

    楼主的问题可以简化为以下代码A和B的区别
    import java.lang.reflect.Array;
    public class Demo {
    public static void main(String[] args)
    {
    Integer[] arrA=(Integer[]) new Object[10];            //A        
    Integer[] arrB=(Integer[]) Array.newInstance(Integer.class, 10); //B
    }
    }
    关于A:人是动物,但动物不一定是人
    关于B:人当然是人,人当然也是动物!虽然Array.newInstance(*,*)方法返回Object类型的对象,但这个对象实际就是
    Integer[]类型数组,虽然再转化为Integer[]数组肯定没问题!这点可以参考Array.newInstance(*,*)方法说明
    如下:希望有帮助
      

  2.   

    但是在array = (T[])Array.newInstance(type, sz); type的类型T也是被擦除了,也就不知道具体是什么类型了
      

  3.   

    我理解的是类型擦除在两个例子都是起作用的,正因为如此,第一个例子是自己new Object[]数组,后期将它赋值给Integer数组,肯定是不行的,而至于get的时候不报错,正是因为在类型擦除后会经过一次类型的恢复(jvm有这个能力)。实际上通过查看字节码,报错是因为checkcast       #20; //class "[Ljava/lang/Integer;" 这个指令去做了类型检查,发现array变量并不是一个Interger[]。
    例子二中array = (T[])Array.newInstance(type, sz);这里构造的是一个Integer[]的数组,和例子一种的Object[],不是一个类型。
      

  4.   

    请问如何知道例子二中array = (T[])Array.newInstance(type, sz);这里构造的是一个Integer[]的数组? 这里不是类型擦出了么
      

  5.   

    请问如何知道例子二中array = (T[])Array.newInstance(type, sz);这里构造的是一个Integer[]的数组? 这里不是类型擦出了么
    擦除只是说Class<T>这里的接受参数变成Class,并不是真的把你的类型抹掉,你代码传入的确确实实是Integer.class,所以会构造出一个Interger数组,可以.getClass打印下看看构造出来的是什么类型。