实现接口方法的方法是否应使用@Override
进行注释?
javadoc of the Override
annotation说:
表示方法声明旨在覆盖超类中的方法声明。如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息。
我不认为接口在技术上是超类。或者是吗?
答案 0 :(得分:284)
尽可能使用@Override。它可以防止出现简单的错误。例如:
class C {
@Override
public boolean equals(SomeClass obj){
// code ...
}
}
这不会编译,因为它没有正确覆盖public boolean equals(Object obj)
。
同样适用于实现接口的方法( 1.6及以上仅)或覆盖超类的方法。
答案 1 :(得分:100)
我相信javac的行为已经改变了 - 用1.5它禁止了注释,而1.6则没有。注释提供了额外的编译时检查,所以如果你使用的是1.6,那我就去了。
答案 2 :(得分:58)
如果方法可用,则应始终使用@Override
注释方法。
在JDK 5中,这意味着重写超类的方法,在JDK 6和7中,它意味着重写超类方法,并实现接口方法。如前所述,原因是它允许编译器捕获您认为重写(或实现)方法的错误,但实际上是定义了一个新方法(不同的签名)。
equals(Object)
与equals(YourObject)
示例是一个标准的例子,但是可以为接口实现提供相同的参数。
我认为注释接口的实现方法并不是强制性的原因是JDK 5将此标记为编译错误。如果JDK 6强制使用此注释,则会破坏向后兼容性。
我不是Eclipse用户,但在其他IDE(IntelliJ)中,只有在项目设置为JDK 6+项目时,才会在实现接口方法时添加@Override
注释。我认为Eclipse类似。
但是,我更希望看到这种用法的不同注释,可能是@Implements
注释。
答案 3 :(得分:15)
答案 4 :(得分:11)
如果要实现在接口中声明的方法(其编译错误),JDK 5.0不允许您使用@Override
注释,但JDK 6.0允许它。因此,您可以根据需要配置项目首选项。
答案 5 :(得分:3)
覆盖从自己的类继承的自己的方法通常不会在使用ide的重构中中断。但是如果重写从库继承的方法,建议使用它。如果你不这样做,你通常会在以后的库更改中得到错误,但这是一个隐藏得很好的错误。
答案 6 :(得分:3)
这不是JDK的问题。在Eclipse Helios中,它允许@Override注释用于已实现的接口方法,无论是JDK 5还是6.对于Eclipse Galileo,不允许使用@Override注释,无论是JDK 5还是6。
答案 7 :(得分:3)
如果具体类不是覆盖抽象方法,那么使用R1C1
进行实现是一个开放的问题,因为编译器将不约而同地警告你任何未实现的方法。在这些情况下,可以认为它会降低可读性 - 在您的代码上阅读更多内容,在较小程度上,它被称为@Override
而不是@Override
。
答案 8 :(得分:2)
对我来说,这通常是一些代码需要Java 6编译的唯一原因。不确定是否值得。
答案 9 :(得分:1)
当您在创建实现接口的类期间告诉它“生成未实现的方法”时,Eclipse本身将添加@Override
注释。
答案 10 :(得分:1)
包含@Override
的问题在于,它让您认为忘记调用super.theOverridenMethod()
方法,而非常混乱。这应该是清晰的。也许Java应该提供@Interface
来使用。哦,还有另外一半的Java特性...
答案 11 :(得分:1)
在java 6及更高版本中,您可以使用 @Override
public void onViewDetachedFromWindow(ChannelsViewHolder holder) {
super.onViewDetachedFromWindow(holder);
((ChannelsViewHolder)holder).clearAnimation();
}
作为实现接口的方法。
但是,我认为它没有意义:覆盖意味着你在超类中拥有一个方法,并且你正在子类中实现它。
如果您正在实施界面,我认为我们应该使用@Override
或其他内容,而不是@Implement
。
答案 12 :(得分:1)
通过阅读java8中的javadoc,您可以在界面覆盖声明中找到以下内容:
如果使用此注释类型注释方法,则编译器必须生成错误消息,除非至少满足以下条件之一:
所以,至少在java8中,你应该在接口方法的实现上使用@Override。
答案 13 :(得分:0)
对于接口,使用@Override导致编译错误。 所以,我不得不删除它。
错误消息“rdd
.map(x => ((x._1, x._3), (x._2, 1.0)))
.reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2))
.mapValues(x => x._1 / x._2)
.take(6).foreach(println)
((2,a),350.0)
((3,b),400.0)
((1,b),250.0)
((1,a),350.0)
((3,a),350.0)
((2,b),450.0)
”。
它还显示为“The method getAllProducts() of type InMemoryProductRepository must override a superclass method
”
它位于Eclipse 4.6.3,JDK 1.8.0_144。
答案 14 :(得分:0)
如果实现interface
的类是abstract
类,则@Override
有助于确保实现是针对interface
方法的;没有@Override
的情况下,即使实现方法签名与abstract
中声明的方法不匹配,interface
类也可以正常编译。不匹配的interface
方法将保持未实现状态。
@Zhao
该方法确实重写或实现了在超类型中声明的方法
显然是指abstract
超类; interface
不能称为超类型。
因此,@Override
是多余的,对具体类中的interface
方法实现不明智。