一种替换扩展另一个 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
注释应用于 ParentClass
和 ChildClass
,则会生成适当的 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 的生成。
假设我有 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
注释应用于 ParentClass
和 ChildClass
,则会生成适当的 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 的生成。