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

Override注释的javadoc说:

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

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

问题阐述


当前回答

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

其他回答

包含@Override的问题是,它会让您认为您忘记调用super.theOverridenMethod()方法,这非常令人困惑。这应该是非常清楚的。也许Java应该提供一个@Interface在这里使用。哦,好吧,还有一个半途而废的Java特性……

这对JDK来说不是问题。在Eclipse Helios中,它允许对实现的接口方法使用@Override注释,无论使用哪种JDK 5或6。至于Eclipse Galileo,无论JDK 5还是6,都不允许使用@Override注释。

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

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

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

通过读取java8中的javadoc,你可以在接口Override的声明中找到以下内容:

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

该方法重写或实现在超类型中声明的方法。 该方法的签名重写等价于在{@linkplain Object}中声明的任何公共方法的签名。

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

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

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

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