【问题标题】:A way to replace the object type for a field in a POJO that extends another POJO一种替换扩展另一个 POJO 的 POJO 中字段的对象类型的方法
【发布时间】:2022-01-19 20:28:18
【问题描述】:

假设我有课

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

【问题讨论】:

标签: java lombok


【解决方案1】:

如果 Lombok 的 @Data 注释同时应用于 ParentClassChildClass,则会生成适当的 getter/setter:

// 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 字段,从而重命名getter/setter 并解决名称冲突。

【讨论】:

    【解决方案2】:

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

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

    即使你看不到它们,它们就在那里(龙目岛魔法)。

    为了了解发生了什么,我建议你去龙目岛实际代码。

    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/

    【讨论】:

    • 所以我们遵循合同,返回的响应必须有 evses,所以重命名字段可能不是一个选项。关闭 setter 和 getter 会达到什么效果?我仍然需要能够访问 evses
    • 通过关闭 setter 和 getter,您可以为特定字段创建自己的 getter 和 setter,以避免名称冲突。
    • @Ahmed,为什么不能重命名? ChildClassParentClassList&lt;AnotherParentPojo&gt; 继承 getEvses/setEvses 并拥有自己的 getEvsesChild/setEvsesChild 处理 List&lt;AnotherChildPojo&gt; 数据。这不是界面的重大更改,而是扩展。
    • 我的错误,我误会了。我能够重命名 getter 和 setter 方法名称,这样它就不会与父类的 getter/setter 冲突,并将字段名称保持为 evses,并且运行顺利。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-02
    • 2016-12-13
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多