向上转型基于对象引用类型还是实际对象类型?Java类型转换疑问
类型转换问题分析
首先明确UML对应的类继承/实现关系:
InterfaceA为顶层接口ClassA实现了InterfaceA接口ClassB继承自ClassA
代码逐行校验(假设ClassB为非抽象类)
InterfaceA obj = new ClassB(); ClassA obj2 = obj;
- 第一行代码合法:ClassB通过继承ClassA间接实现了
InterfaceA,接口引用指向实现类实例属于自动向上转型,编译、运行均无报错。 - 第二行代码编译阶段直接报错:编译期仅识别变量的引用类型,此时
obj的引用类型为InterfaceA,将InterfaceA类型引用赋值给ClassA类型变量属于向下转型,必须显式声明强制转换,修改为ClassA obj2 = (ClassA) obj;才可通过编译。- 若添加强制转换后,运行阶段可正常执行:
obj指向的实际对象为ClassB实例,ClassB是ClassA的子类,类型兼容,不会抛出ClassCastException运行时异常。
- 若添加强制转换后,运行阶段可正常执行:
内容的提问来源于stack exchange,提问作者bbawj
相关产品推荐
相关产品推荐

