编译器无法识别Lombok Getter用于重写方法

8
假设我们有一个在外部组件中的接口TestInterface,我们无法更改它:
public interface TestInterface {

    Boolean isTest();
    //more getter and setter methods
}

这是一个接口的实现,其中有更多的成员对应于父接口。Lombok生成的getter/setter不被编译器识别,所以我必须添加实际的getter方法来使下面的类可以编译。

@Getter
@Setter
public class TestImplementation implements TestInterface {

    Boolean test;
    //more members
}

编译错误是在接口方法未实现时出现的标准错误: my.package.TestImplementation不是抽象的,并且没有覆盖my.package.TestInterface中的isTest()抽象方法。 假设Lombok的getter和setter是在编译后生成的,我不明白为什么调用由Lombok生成的getter(它们是可编译的)。

准确地说:您说,在同一个项目中,您有两个类。其中一个使用注释很好,但是您在这里展示的类会给您带来编译器错误?这听起来很奇怪,因为某个类实现某个接口的事实真的不应该干扰Lombok正在做的事情。 - GhostCat
这是否适用于所有Lombok注释,还是只适用于实现此接口的类上的特定getter?您确定已正确“安装”Lombok到IntelliJ中吗? - tobias_k
@GhostCat:Lombok的getter在整个项目中都被调用并且编译完美。只有当getter方法同时是实现接口的覆盖时才会出现问题。是的,我展示的类会出现编译错误。 - pal0man3gra
@tobias_k Lombok可以使用,getter和setter通常可以编译,只有覆盖方法会出现问题。解决方法是编写getter,但这样我就不需要Lombok了。 - pal0man3gra
2个回答

12
问题似乎在于对于一个字段Boolean test,Lombok会生成一个方法Boolean getTest(),而不是接口所需的Boolean isTest()。只有当属性为boolean test时,才会得到一个boolean isTest()方法,但是返回类型与接口不匹配。
因此,似乎没有办法绕过自己实现isTest方法。

感谢您为此带来的启示。我尝试给您的答案点赞,但是我的声望不够。 - pal0man3gra
答案被接受了。我可以自己编写方法并在有选择的情况下使用原始类型。 - pal0man3gra
根本原因是Java的BeanSpec要求Boolean的getter方法必须以get前缀命名(而不是boolean)。 - Jan Rieke

1
考虑到 Java Bean 命名规范,类型为 Boolean 的包装对象字段的 getter 应该是 getTest。因此 Lombok 正在做“正确”的事情。您可以将字段类型更改为原始 boolean 以获得所需的方法,或者调整接口以与 Java Bean 命名约定匹配。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接