一种替换扩展另一个 POJO 的 POJO 中字段的对象类型的方法

A way to replace the object type for a field in a POJO that extends another POJO

假设我有 class

public class ParentClass {
    private String field1;
    private String field2;
    private String field3;
    private List<AnotherParentPojo> evses;
}

public class AnotherChildPojo extends AnotherParentPojo {
    private String fieldA;
    private String fieldB;
    private String fieldC;
}

public class ChildClass extends ParentClass {
    private List<AnotherChildPojo> evses;
}

然而,这会在 ChildClass 中导致错误“两种方法具有相同的擦除,但都没有覆盖另一个”。我知道它不可能覆盖一个字段,但是有没有办法在不必更改 ParentClass 或 AnotherParentPojo 的情况下实现这一点?我只能控制 ChildClass 和 AnotherChildPojo

如果将 Lombok 的 @Data 注释应用于 ParentClassChildClass,则会生成适当的 getters/setters:

// ParentClass
public void setEvses(List<AnotherParentPojo> list) {...}
public List<AnotherParentPojo> getEvses() {...}

并且名称冲突发生在 ChildClass 中,因为它继承自 ParentClass

// ChildClass
public void setEvses(List<AnotherChildPojo> list) {...}
public List<AnotherChildPojo> getEvses() {...}

如果可以访问 ChildClass,最简单的解决方案就是重命名其 evses 字段,从而重命名 getters/setters 并解决名称冲突。

正如你提到的 @Data 我假设的注释,你正在使用 lombok [1]。

ParentClass 及其子 ChildClass 基本上声明相同 setters/getters 但擦除类型不同的问题。

虽然你看不到它们,但它们就在那里(龙目岛魔法)。

为了了解发生了什么,我建议您对实际代码进行 de-lombok。

public class ParentClass {

...

    public List<AnotherParentPojo> getEvses() {
        return evses;
    }

    public void setEvses(List<AnotherParentPojo> evses) {
        this.evses = evses;
    }

...

}
public class ChildClass extends ParentClass {
...

    public List<AnotherChildPojo> getEvses() {
        return evses;
    }

    public void setEvses(List<AnotherChildPojo> evses) {
        this.evses = evses;
    }
...
}

解决方案

解决方案可能是仅重命名其中一个“冲突”字段,​​或使用特定字段的 @Setter(AccessLevel.NONE) @Getter(AccessLevel.NONE) 注释关闭 setter 和 getter 的生成。


[1] https://projectlombok.org/