Java中如何将父类对象向下转型为子类对象调用其独有方法
问题原因
- 语法错误:
getClass是Object类提供的成员方法,调用时需要加括号,原代码漏写了括号,实际运行会先触发语法报错。 - 核心逻辑错误:你将强转后的
Child类型对象重新赋值给了静态类型为Parent的tempParent变量,Java编译阶段只会识别变量的静态类型,Parent类没有定义doSomething方法,因此编译阶段就会抛出方法不存在的错误。
正确实现
方案1:使用instanceof做类型检查(推荐,兼容Child的子类场景,自动处理空指针)
如果允许Child的子类实例也匹配条件,推荐用这个方案,Java 16及以上版本还支持模式匹配简化代码:
// Java 16+ 写法,无需手动强转 if(tempParent instanceof Child child) { child.doSomething(); } // 低版本Java写法 if(tempParent instanceof Child) { Child child = (Child) tempParent; child.doSomething(); }
方案2:严格匹配类型(仅Child类本身的实例能匹配)
如果要求只有实际类型严格等于Child类才执行逻辑,需要用getClass(),注意要提前判空避免空指针异常:
if(tempParent != null && tempParent.getClass() == Child.class) { Child child = (Child) tempParent; child.doSomething(); }
补充说明
instanceof Child:对象是Child本身、Child的子类实例、null时返回结果分别为true、true、falsegetClass() == Child.class:对象是Child本身、Child的子类实例、null时返回结果分别为true、false、抛出空指针异常
内容的提问来源于stack exchange,提问作者Andreas Sandberg
相关产品推荐
相关产品推荐

