在Java中能否将父类对象赋值给子类变量?强转后仍报错如何解决?
报错原因
Java的引用类型转型必须符合实际运行类型匹配规则:
- 父类引用指向子类实例时(也就是常说的向上转型),才可以安全做向下类型转换
- 你代码中的
e引用实际指向的是Employee类的原生实例,并非Teacher类或者Teacher子类的实例,JVM运行时做类型校验时发现类型不匹配,就会抛出ClassCastException运行时异常。
可行解决方案
方案1:调整父类引用的实际指向
如果业务逻辑需要得到Teacher类型实例,可以直接让父类引用初始指向子类实例,再做向下转型,修改后可运行代码如下:
class Employee{ int e; } class Teacher extends Employee{ int f; } class run{ public static void main(String args[]){ Employee e; // 父类引用指向子类实例 e= new Teacher(); Teacher t; // 此时强转符合运行时类型要求,不会报错 t= (Teacher)e; } }
方案2:转型前增加类型校验
如果父类引用的实际指向不确定,可以在转型前用instanceof关键字做类型判断,避免运行时异常:
class run{ public static void main(String args[]){ Employee e; e= new Employee(); Teacher t = null; // 先校验类型匹配再转型 if (e instanceof Teacher) { t= (Teacher)e; } else { // 类型不匹配时的自定义处理逻辑,比如初始化新的Teacher实例 t = new Teacher(); } } }
内容的提问来源于stack exchange,提问作者Fatima Shirazi
相关产品推荐
相关产品推荐

