用 getter/setter 实现嵌套抽象 class

implement nested abstract class with getter/setter

我有以下抽象class结构:

public abstract class A {
    ...
    private List<B> b;

    public List<B> getB() {
        return b;
    }
    public void setB(List<B> b) {
        this.b = b;
    }
    public static abstract class B {

    }
}

并像这样实现它:

public class AA extends A {
    public static class BB extends B {
        ...
    }

当我现在使用 jackson 将 Json 映射到 AA 时,出现错误,它无法创建 A$B 的实例。我认为这是因为 A 中的 getter/setter 仍然引用 B 而不是 BB,这导致了错误。有什么办法可以做到这一点,而无需将 getter/setter 放入 subclass?

您可以添加类型捕获以确保 b 始终正确键入,如下所示:

public abstract class A<T extends A.B> {
    ...
    private List<T> b;

    public List<T> getB() {
        return b;
    }
    public void setB(List<T> b) {
        this.b = b;
    }
    public static abstract class B {
        ...
    }
}

然后

public class AA extends A<AA.BB> {
    ...
    public static class BB extends B {
        ...
    }

如果你创建一个 AA 的实例,你需要一个抽象的实例 class B 并且你现在定义要使用的实例。仅提供一些实现 (BB) 是不够的。

反序列化有多种选择。如果你没有注释,Jackson 可能会退回到使用最近的 superclass 的构造函数,它有一个 public 构造函数,没有参数。创建空对象后,它会使用反射设置字段。

  • 反射将绕过构造函数中的任何验证,例如 Objects.requireNotNull

使用Jackson 的一种更精致的方式是在构造函数中使用@JsonCreator@JsonProperty,命名所有参数。

  • 这使您能够强制 Jackson 使用您创建的构造函数并验证对象。

我不太确定这个相当不寻常的结构。毕竟,你有一个抽象class嵌套在一个抽象class里,我见多了,但是没见过这样的。有充分的理由吗?或者将内部 class 移动到它自己的文件中不是问题吗? (毕竟是public static