实现接口方法的方法应该用@Override进行注释吗?

Override注释的javadoc说:

指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。

我不认为接口在技术上是超类。真的是这样吗?

问题阐述


当前回答

如果可以的话,应该总是使用@Override来注释方法。

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

equals(Object) vs. equals(YourObject)的例子是一个标准的例子,但同样的论点也可以用于接口实现。

我想,不强制注释接口的实现方法的原因是JDK 5将其标记为编译错误。如果JDK 6强制使用这个注释,就会破坏向后兼容性。

我不是Eclipse用户,但在其他ide (IntelliJ)中,如果项目被设置为JDK 6+项目,则只有在实现接口方法时才会添加@Override注释。我可以想象Eclipse是类似的。

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

其他回答

我相信javac的行为已经改变了——在1.5版本中它禁止注释,而在1.6版本中则没有。注释提供了额外的编译时检查,所以如果您使用的是1.6,我会选择它。

对我来说,这通常是一些代码需要Java 6编译的唯一原因。不确定是否值得。

在java 6及更高版本中,可以使用@Override来实现接口的方法。

但是,我不认为这是有意义的:覆盖意味着你在超类中有一个方法,而你在子类中实现它。

如果你正在实现一个接口,我认为我们应该使用@ implementation或其他东西,而不是@Override。

如果实现接口的类是一个抽象类,@Override用于确保实现是针对接口方法的;如果没有@Override,即使实现方法签名与接口中声明的方法不匹配,抽象类也可以很好地编译;不匹配的接口方法将保持未实现。 @Zhao引用的Java文档

该方法重写或实现在超类型中声明的方法

显然引用了一个抽象超类;接口不能称为超类型。 因此,@Override是冗余的,对于具体类中的接口方法实现并不合理。

如果一个具体类没有覆盖一个抽象方法,使用@Override来实现是一个开放的问题,因为编译器总是会警告你任何未实现的方法。在这些情况下,可以提出这样的论点,即它降低了可读性——在代码中需要阅读的内容更多,而且在较小的程度上,它被称为@Override而不是@ implementation。