美文网首页
【字段一致】父类转化为子类

【字段一致】父类转化为子类

作者: 蓝笔头 | 来源:发表于2021-08-27 09:55 被阅读0次

测试结构

@Data
@NoArgsConstructor
@AllArgsConstructor
public class SuperClass {
    private long id;
    private String name;
}

@Data
@ToString(callSuper = true)
public class SubClass extends SuperClass {
}

转换

  • 1)直接转换
public class TestMain {
    public static void main(String[] args) {
        SuperClass superClass = new SuperClass(1, "name");
        SubClass subClass = (SubClass) superClass;
        System.out.println(subClass);
    }
}

出现如下异常:

Exception in thread "main" java.lang.ClassCastException: org.company.cast.SuperClass cannot be cast to org.company.cast.SubClass
    at org.company.TestMain.main(TestMain.java:9)
  • 2)序列化反序列化

需引入 Jackson 依赖,可参考 Jackson 使用简介

public class TestMain {
    public static void main(String[] args) {
        SuperClass superClass = new SuperClass(1, "name");
        String serialize = serialize(superClass);
        SubClass subClass = deserialize(serialize, SubClass.class);
        System.out.println(subClass);
    }

    private static final ObjectMapper objectMapper = new ObjectMapper();

    @SneakyThrows
    public static String serialize(Object obj) {
        return objectMapper.writeValueAsString(obj);
    }

    @SneakyThrows
    public static <T> T deserialize(String json, Class<T> clazz) {
        return objectMapper.readValue(json, clazz);
    }
}

控制台输出:

SubClass(super=SuperClass(id=1, name=name))
  • 3)BeanUtils.copyProperties

使用的是 Spring 的 spring-beans 版本。

public class TestMain {
    public static void main(String[] args) {
        SuperClass superClass = new SuperClass(1, "name");

        SubClass subClass = new SubClass();
        BeanUtils.copyProperties(superClass, subClass);
        System.out.println(subClass);
    }
}

控制台输出:

SubClass(super=SuperClass(id=1, name=name))

API 差异

  • Spring spring-beans 版本:源对象 source 在前面,目标对象 target 在后面。
package org.springframework.beans;

public abstract class BeanUtils {
    public static void copyProperties(Object source, Object target) throws BeansException {
}
  • Apache commons-beanutils 版本:源对象 orig 在后面,目标对象 dest 在前面。
package org.apache.commons.beanutils;

public class BeanUtils {
    public static void copyProperties(final Object dest, final Object orig)
}

参考

相关文章

  • 【字段一致】父类转化为子类

    测试结构 转换 1)直接转换 出现如下异常: 2)序列化反序列化 需引入 Jackson 依赖,可参考 Jacks...

  • JAVA之域隐藏、静态方法隐藏以及动态、静态绑定

    1、域隐藏 当子类继续父类时,出现相同字段时父类字段不会将子类字段覆盖,而只是将其“隐藏”。 例子: 父类: pu...

  • 类加载-初始化阶段

    加载顺序总结 父类的静态字段——>父类静态代码块——>子类静态字段——>子类静态代码块——>父类成员变量(非静态字...

  • Java继承

    1 父类使用子类属性问题 一般来说子类可以使用父类非private定义的字段,但是父类是不能使用子类的字段的。例如...

  • 探讨Java中的父子类转化问题

    有两个问题: (1)子类对象可以转化为父类对象吗? (2)父类对象可以转化为子类对象吗? ------------...

  • 数据库

    GreenDao greendao数据表继承父类的字段?子类继承父类,并包含同名字段,override父类的get...

  • Java中的继承

    0、继承使子类获得父类public、protected类型的字段和方法。 一句话:子类继承父类,子类有了父类所有的...

  • 里氏转换

    里氏转换的原则:1、子类可以直接赋值给父类。父类若指向子类,那么可以强制转化为该子类。 例如 static voi...

  • .Net基础10

    1、里氏转换 1)、子类可以赋值给父类2)、如果父类中装的是子类对象,那么可以讲这个父类强转为子类对象 2、类型转...

  • 类的加载机制

    类不被初始化的情况 对于静态字段,只有直接定义这个字段的类才会变初始化,子类引用父类的静态字段不会导致子类的初始化...

网友评论

      本文标题:【字段一致】父类转化为子类

      本文链接:https://www.haomeiwen.com/subject/pfduiltx.html