为了账号安全,请及时绑定邮箱和手机立即绑定

Java 使用通用基础模型创建模型

Java 使用通用基础模型创建模型

慕森卡 2023-09-27 21:30:05
我想创建一些具有几乎相同属性的类。示例: 1. A 类,属性:String a、String b、String c、AnObject d 2. B 类,属性:String a、String b、String c、OtherObject dA类和B类的区别仅在于属性d。我已经创建了一个类public class C <T> {    private String a;    private String b;    private String c;    private T d;}那么对于A类public class A extends C<A> {    private SomeObject z;}对于B类public class B extends C<B> {    private OtherObject z;    private Integer y;}然而,当我使用 jackson 将其制作为 JSON 时,它就成为一个问题。A变成这样:{    "a": "",    "b": "",    "c": "",    "d": {        "a": null,        "b": null,        "c": null,        "z": ""    }}我想要实现的是:{    "a": "",    "b": "",    "c": "",    "d": {        "z": ""    }}如何实现这一目标?
查看完整描述

2 回答

?
函数式编程

TA贡献1807条经验 获得超9个赞

我在这里可以看到两种可能的解决方案:仅使用没有继承的泛型类或使用没有泛型的继承。


类A并B不必扩展类C。这些冗余属性从父类(即 )进入 JSON 表示形式C。


    public class C <T> {

        private String a;

        private String b;

        private String c;

        private T d;

    }


    public class A {

        private SomeObject z;

    }


    public class B {

        private OtherObject z;

        private Integer y;

    }


    // example of usage

    C<A> a = new C<>();

    a.setD(new A());

    // and so on

    C<B> b = new C<>();

    b.setD(new B());

    // and so on


另一种方法是创建A和B子元素,C在这种情况下,其子元素不必是通用的。


    @JsonTypeInfo(

      use = JsonTypeInfo.Id.NAME, 

      include = JsonTypeInfo.As.PROPERTY, 

      property = "type")

    @JsonSubTypes({ 

      @Type(value = A.class, name = "a"), 

      @Type(value = B.class, name = "b") 

    })

    public class C {

        private String a;

        private String b;

        private String c;

    }


    public class A extends C {

        private SomeObject z;

    }


    public class B extends C {

        private OtherObject z;

        private Integer y;

    }


    // example of usage

    A a = new A();

    B b = new B();


查看完整回答
反对 回复 2023-09-27
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

这很可能是因为您使用泛型的方式而发生的。类 C 包含其子级(私有 T d),因此当您实例化 A 时,您将继承字段 a、b、c 和 A 的另一个实例,该实例也将包含字段 a、b、c。不确定你在这里要做什么,但如果你想解决这个问题,请从 c 中删除泛型(私有 T d)。


public class C {

    private String a;

    private String b;

    private String c;

}

public class A extends C {

    private SomeObject z;

}


查看完整回答
反对 回复 2023-09-27
  • 2 回答
  • 0 关注
  • 97 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信