我们应该@Override接口的方法实现吗?

Ben*_*ers 414 java oop annotations interface

是否应该使用实现接口方法的方法进行注释@Override

注释javadocOverride说:

指示方法声明旨在覆盖超类中的方法声明.如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息.

我不认为接口在技术上是超类.或者是吗?

Question Elaboration

jjn*_*guy 291

你应该尽可能使用@Override.它可以防止出现简单的错误.例:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,因为它没有正确覆盖public boolean equals(Object obj).

对于实现接口(仅限1.6及更高版本)或覆盖超类的方法的方法也是如此.

  • 请注意,您不能**将@Override注释添加到在Java 5中实现接口的方法 - 它会生成错误.在Java 6中允许它. (146认同)
  • 嗯,不,它没有.事实上,Eclipse在填写实现接口的方法时会自动插入@Override. (17认同)
  • -1直到答案中提到了关于实现接口方法的Java 1.5到1.6的不同行为.仅仅因为我已经看到它对人们来说是一个令人困惑的方面,它真的值得一提. (14认同)
  • 如果eclipse抱怨,那么将你的jdk升级到> 1.5并将编译器合规性级别更改为1.6或1.7.要做到这一点,请右键单击ur project-> properties-> Java compiler并选择一个高于1.5的编译器. (2认同)

Jon*_*eet 102

我相信javac的行为已经改变了 - 用1.5它禁止了注释,而1.6则没有.注释提供额外的编译时检查,所以如果你使用1.6,我会去做.

  • @Michael您可以注意到任何界面是否已被删除. (16认同)

GKe*_*lly 62

如果方法@Override可用,您应该始终注释方法.

在JDK 5中,这意味着重写超类的方法,在JDK 6和7中,它意味着重写超类的方法,并实现接口的方法.如前所述,原因是它允许编译器捕获您认为重写(或实现)方法的错误,但实际上是定义了一个新方法(不同的签名).

所述equals(Object)对比equals(YourObject)例子就是一个标准的情况下,但相同的参数可以用于接口实现制成.

我想象一下,注释接口的实现方法并不是强制性的原因是JDK 5将此标记为编译错误.如果JDK 6强制使用此注释,则会破坏向后兼容性.

我不是Eclipse用户,但在其他IDE(IntelliJ)中,@Override只有在项目设置为JDK 6+项目时,才会在实现接口方法时添加注释.我认为Eclipse是类似的.

但是,我更希望看到这种用法的不同注释,可能是@Implements注释.


Sil*_*ior 11

@Override如果要实现在接口中声明的方法(其编译错误),JDK 5.0不允许您使用注释,但JDK 6.0允许它.因此,您可以根据需要配置项目首选项.


小智 7

通过阅读java8中的javadoc,可以发现Override接口的声明如下:

如果使用此注释类型注释方法,则编译器需要生成错误消息,除非至少满足以下条件之一:

  • 该方法确实覆盖或实现在超类型中声明的方法。
  • 该方法的签名与 {@linkplain Object} 中声明的任何公共方法的签名等效。

因此,至少在 java8 中,您应该在接口方法的实现上使用 @Override。


jua*_*ito 5

如果具体类没有覆盖抽象方法,则使用@Overridefor实现是一个开放的问题,因为编译器总是会警告您任何未实现的方法。在这些情况下,可以提出一个论点,认为它会降低可读性——在你的代码上阅读更多的东西,在较小程度上,它被调用@Override而不是@Implement