You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Child对象转型为仅保留Parent属性的Parent对象?

问题分析

你遇到的核心问题是Java的引用类型转换不会改变对象的实际类型。当你执行parent = (Parent) child;时,只是让编译阶段parent变量的声明类型变成了Parent,但运行时这个对象本质还是Child实例。所以调用toString()时,会优先执行Child类中重写的方法,导致输出还是Child的格式。

解决方案

要得到一个真正的Parent对象(仅包含Parent类的属性),你需要创建一个全新的Parent实例,并将Child中属于Parent的属性值复制过去,而不是仅仅做类型转换。

方法1:手动复制属性(简单直接)

直接调用Parent的setter方法,把Child里的父类属性值传递过去:

public class TestExtension {
    public static void main(String arg[]) {
        Child child = new Child();
        child.setFirstName("fist name");
        child.setLastName("last name");
        
        // 创建新的Parent对象,复制父类属性
        Parent parent = new Parent();
        parent.setLastName(child.getLastName());
        
        System.out.println(child);
        System.out.println(parent);
    }
}

方法2:添加转换方法(优雅复用)

如果需要多次转换,可以在类中添加专门的转换逻辑,比如:
在Parent类中新增复制构造器:

// Parent类中添加接收Child对象的构造器
public Parent(Child child) {
    this.lastName = child.getLastName();
}

之后在测试类中直接使用:

Parent parent = new Parent(child);

或者在Child类中添加转换方法:

public Parent toParent() {
    Parent parent = new Parent();
    parent.setLastName(this.getLastName());
    return parent;
}

调用时更直观:

Parent parent = child.toParent();

运行结果

修改后执行代码,就能得到你期望的输出:

Child [firstName=fist name, getLastName()=last name]
Parent [lastName=last name]

补充说明

如果你的类有大量属性,手动复制会很繁琐,这时可以考虑用反射批量复制父类属性,或者使用第三方Bean工具类(比如Apache Commons BeanUtils的copyProperties方法)。不过对于简单场景,手动复制或自定义转换方法是最直接且无额外依赖的方式。

内容的提问来源于stack exchange,提问作者Yogesh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:44:38