有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用getter/setter实现嵌套抽象类

我有以下抽象类结构:

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在AA上映射Json时,我得到一个错误,它无法创建A$B的实例。我认为这是因为A中的getter/setter仍然引用B而不是BB,这导致了错误。有没有什么方法可以这样做,而不用将getter/setter放在子类中


共 (3) 个答案

  1. # 1 楼答案

    如果创建AA的实例,则需要抽象类B的实例,然后立即定义要使用的实例。仅仅提供一些实现(BB)是不够的

  2. # 2 楼答案

    有几种方法可以反序列化。如果没有注释,Jackson可能会使用最近超类的构造函数,该构造函数有一个没有参数的公共构造函数。创建空对象后,它会使用反射设置场

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

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

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

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

  3. # 3 楼答案

    您可以添加类型捕获,以确保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 {
            ...
        }