实现接口方法的方法应该用@Override进行注释吗?
Override注释的javadoc说:
指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。
我不认为接口在技术上是超类。真的是这样吗?
问题阐述
实现接口方法的方法应该用@Override进行注释吗?
Override注释的javadoc说:
指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。
我不认为接口在技术上是超类。真的是这样吗?
问题阐述
当前回答
当您在创建实现接口的类期间告诉Eclipse“生成未实现的方法”时,Eclipse本身将添加@Override注释。
其他回答
你应该尽可能使用@Override。它可以防止犯简单的错误。例子:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
这不能编译,因为它没有正确地覆盖公共布尔值= (Object obj)。
对于实现接口(仅限1.6及以上版本)或重写超类方法的方法也是如此。
对我来说,这通常是一些代码需要Java 6编译的唯一原因。不确定是否值得。
如果可以的话,应该总是使用@Override来注释方法。
在JDK 5中,这意味着重写超类的方法,在JDK 6和7中,这意味着重写超类的方法,并实现接口的方法。原因,如前所述,它允许编译器在您认为您正在重写(或实现)一个方法,但实际上是在定义一个新方法(不同的签名)时捕获错误。
equals(Object) vs. equals(YourObject)的例子是一个标准的例子,但同样的论点也可以用于接口实现。
我想,不强制注释接口的实现方法的原因是JDK 5将其标记为编译错误。如果JDK 6强制使用这个注释,就会破坏向后兼容性。
我不是Eclipse用户,但在其他ide (IntelliJ)中,如果项目被设置为JDK 6+项目,则只有在实现接口方法时才会添加@Override注释。我可以想象Eclipse是类似的。
但是,对于这种用法,我更希望看到不同的注释,可能是@Implements注释。
我会利用一切机会。你什么时候使用Java的@Override注释,为什么?
包含@Override的问题是,它会让您认为您忘记调用super.theOverridenMethod()方法,这非常令人困惑。这应该是非常清楚的。也许Java应该提供一个@Interface在这里使用。哦,好吧,还有一个半途而废的Java特性……