Java创建具有通用基础模型的模型

时间:2019-10-07 15:01:57

标签: java oop

我想创建一些具有几乎相同属性的类。例: 1. A类,属性:字符串a,字符串b,字符串c,AnObject d 2.类B,属性:字符串a,字符串b,字符串c,OtherObject d

A类和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;
}

但是,当我使用杰克逊将其设为JSON时,这成为一个问题。 A变成这样:

{
    "a": "",
    "b": "",
    "c": "",
    "d": {
        "a": null,
        "b": null,
        "c": null,
        "z": ""
    }
}

我想要实现的是:

{
    "a": "",
    "b": "",
    "c": "",
    "d": {
        "z": ""
    }
}

如何实现?

2 个答案:

答案 0 :(得分:0)

这很可能是由于使用泛型的方式引起的。类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;
}

答案 1 :(得分:0)

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

AB不必扩展类C。这些冗余属性从父类(即C)进入JSON表示。

    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的{​​{1}}和B的子代在这种情况下不必是通用的。

C