我们应该@Override接口的方法实现吗?

时间:2008-10-17 15:18:02

标签: java oop interface annotations

实现接口方法的方法是否应使用@Override进行注释?

javadoc of the Override annotation说:

  

表示方法声明旨在覆盖超类中的方法声明。如果使用此批注类型注释方法但不覆盖超类方法,则编译器需要生成错误消息。

我不认为接口在技术上是超类。或者是吗?

Question Elaboration

15 个答案:

答案 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,您可以在界面覆盖声明中找到以下内容:

如果使用此注释类型注释方法,则编译器必须生成错误消息,除非至少满足以下条件之一:

  • 该方法会覆盖或实现以超类型声明的方法。
  • 该方法的签名覆盖等同于{@linkplain Object}中声明的任何公共方法的签名。

所以,至少在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

引用的Java文档
  

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

显然是指abstract超类; interface不能称为超类型。 因此,@Override是多余的,对具体类中的interface方法实现不明智。