向上转型自不用说,对向下转型原理也知道,主要看父类的引用:如果父类变量引用的是正确的子类类型(即父类对象引用的是子类型的内存空间,然后赋给子类对象),则赋值将执行;如果父类变量引用的不是相关的子类型,将产生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
异常正如注解中所述,为什么会出现该问题,请各位赐教!
java不支持数组类型的协变/逆变。也就是说SurCode
派生自Object
但是SurCode[]
和Object[]
没有继承关系。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。