Java中数组的类型转换问题

向上转型自不用说,对向下转型原理也知道,主要看父类的引用:如果父类变量引用的是正确的子类类型(即父类对象引用的是子类型的内存空间,然后赋给子类对象),则赋值将执行;如果父类变量引用的不是相关的子类型,将产生ClassCastException异常。
通过下属代码测试,符合原理。

    Object[] o={"qw","we","rt"};
        Object[] oo=new String[]{"qw","we","rt"};
        String[] s=new String[3];
        s=(String[]) o;
        String[]ss=(String[]) oo;

但在实际运用时出现的情况令我不解,如:

     Enum[] en=Util.parse("SurCode", element, SurCode.A);//SurCode为枚举类型,该函数返回的数组引用该枚举类型,通过下边的代码可验证
     System.out.println( (en[0].getClass()));
        moreSurCode=new SurCode[en.length];
        for(int i=0;i<en.length;i++){
            moreSurCode[i]=(SurCode) en[i];//可以正常转换
        }
        SurCode[] moreSurCode1= (SurCode[]) en;//此句话就会报 java.lang.ClassCastException: [Ljava.lang.Enum; cannot be cast to SurCode

异常正如注解中所述,为什么会出现该问题,请各位赐教!

我觉得问题可能出现在 Enum[] en=Util.parse("SurCode", element, SurCode.A);这个方法返回类型究竟是不是 SurCode类型,你可以试试用 instanceof判断一下en是不是 SurCode类型,打印出来看一看。

java不支持数组类型的协变/逆变。也就是说SurCode派生自Object但是SurCode[]和Object[]没有继承关系。