实现接口方法的方法应该用@Override进行注释吗?
Override注释的javadoc说:
指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。
我不认为接口在技术上是超类。真的是这样吗?
问题阐述
实现接口方法的方法应该用@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注释。
其他回答
对我来说,这通常是一些代码需要Java 6编译的唯一原因。不确定是否值得。
如果一个具体类没有覆盖一个抽象方法,使用@Override来实现是一个开放的问题,因为编译器总是会警告你任何未实现的方法。在这些情况下,可以提出这样的论点,即它降低了可读性——在代码中需要阅读的内容更多,而且在较小的程度上,它被称为@Override而不是@ implementation。
我会利用一切机会。你什么时候使用Java的@Override注释,为什么?
如果可以的话,应该总是使用@Override来注释方法。
在JDK 5中,这意味着重写超类的方法,在JDK 6和7中,这意味着重写超类的方法,并实现接口的方法。原因,如前所述,它允许编译器在您认为您正在重写(或实现)一个方法,但实际上是在定义一个新方法(不同的签名)时捕获错误。
equals(Object) vs. equals(YourObject)的例子是一个标准的例子,但同样的论点也可以用于接口实现。
我想,不强制注释接口的实现方法的原因是JDK 5将其标记为编译错误。如果JDK 6强制使用这个注释,就会破坏向后兼容性。
我不是Eclipse用户,但在其他ide (IntelliJ)中,如果项目被设置为JDK 6+项目,则只有在实现接口方法时才会添加@Override注释。我可以想象Eclipse是类似的。
但是,对于这种用法,我更希望看到不同的注释,可能是@Implements注释。
这对JDK来说不是问题。在Eclipse Helios中,它允许对实现的接口方法使用@Override注释,无论使用哪种JDK 5或6。至于Eclipse Galileo,无论JDK 5还是6,都不允许使用@Override注释。