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


432

实现接口方法的方法是否应带有注释@Override

注释JavadocOverride说:

指示方法声明旨在覆盖超类中的方法声明。如果使用此注释类型对方法进行注释但未覆盖超类方法,则要求编译器生成错误消息。

我认为接口从技术上讲不是超类。还是?

Question Elaboration


5
哇,这个问题可能更短,但这是我需要的问题。谢谢
Dan Rosenstark 2010年

1
我找不到@Override文章的替代品(Oracle最近移走了旧的Sun博客)。你知道怎么找到吗?
比尔蜥蜴2012年

4
现在(2015年),我们应该有一个@Implement(s)批注。这将使事情变得清楚!
亚历克斯(Alex)

3
到现在(2015年),我们应该在Java 8中使用@Override吗?
Lorenzo Sciuto 2015年

Answers:


305

您应该尽可能使用@Override。它可以防止犯下简单的错误。例:

class C {
    @Override
    public boolean equals(SomeClass obj){
        // code ...
    }
}

由于无法正确覆盖,因此无法编译public boolean equals(Object obj)

实现接口(仅限1.6及更高版本)或重写Super类的方法的方法也是如此。


150
请注意,您不能将@Override批注添加到在Java 5中实现接口的方法中-这会产生错误。它允许在Java中6
比尔·米歇尔

17
嗯,不,不是。实际上,Eclipse在填充实现接口的方法时会自动插入@Override。
jjnguy 2010年

14
-1,直到答案包括关于Java 1.5到1.6在实现接口方法方面的不同行为。仅仅因为我认为这对人们来说是一个令人困惑的方面,所以确实值得一提。
Grundlefleck 2010年

2
如果eclipse抱怨,则将ur jdk升级到> 1.5,并将编译器合规性级别更改为1.6或1.7。为此,请右键单击ur project-> properties-> Java编译器,然后选择高于1.5的版本。
罗斯

1
谁能想到一个实际证明答案合理的示例(实现接口而不是覆盖基本方法)?对我来说,一个很大的好处是,它有助于使读者对使用特定方法的方式和方式产生期望。
乔·李·莫耶

103

我相信javac的行为已经改变-1.5禁止注释,而1.6则没有。批注提供了额外的编译时检查,因此如果您使用1.6,我会去做的。


1
什么是额外的支票?
迈克尔·卡曼

17
@Michael您可以注意到是否已删除任何接口。
Sanghyun Lee

68

@Override如果有可用的方法,则应始终对其进行注释。

在JDK 5中,这意味着重写超类的方法;在JDK 6和7中,这意味着重写超类的方法;以及实现接口的方法。如前所述,其原因是它允许编译器在您认为您覆盖(或实现)方法但实际上定义了新方法(不同签名)的地方捕获错误。

所述equals(Object)对比equals(YourObject)例子就是一个标准的情况下,但相同的参数可以用于接口实现制成。

我想像一下,对接口的实现方法进行注释不是强制性的原因是JDK 5将其标记为编译错误。如果JDK 6强制执行此注释,则它将破坏向后兼容性。

我不是Eclipse用户,但是在其他IDE(IntelliJ)中,@Override如果将项目设置为JDK 6+项目,则仅在实现接口方法时才添加注释。我可以想象Eclipse是类似的。

但是,我更希望看到此用法的其他注释,也许是@Implements注释。



11

@Override如果要实现在接口中声明的方法(其编译错误),则JDK 5.0不允许使用注释,但是JDK 6.0允许使用注释。因此,您可以根据需要配置项目首选项。


4

如果具体类没有覆盖抽象方法,那么实现@Override用于实现将是一个悬而未决的事情,因为编译器将始终向您警告任何未实现的方法。在这些情况下,可以提出一个论点,认为这有损于可读性-在您的代码上阅读的东西更多,而在较小程度上,它被称为@Override而不是@Implement


3

覆盖从您自己的类继承的自己的方法通常不会在使用ide进行重构时中断。但是,如果覆盖从库继承的方法,则建议使用它。如果您不这样做,则在以后的库更改中通常不会出现任何错误,但是会隐藏好错误。


3

JDK没问题。在Eclipse Helios中,它允许@Override注释用于已实现的接口方法,无论是JDK 5还是6。对于Eclipse Galileo,不允许@Override注释,无论是JDK 5还是6。



2

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

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

  • 该方法的确覆盖或实现了在超类型中声明的方法。
  • 该方法的签名与{@linkplain Object}中声明的任何公共方法的签名等效。

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


1

@Override当您在创建实现接口的类的过程中告诉它“生成未实现的方法”时,Eclipse本身将添加注释。


1

包含的问题@Override在于,它使您认为忘记了调用该super.theOverridenMethod()方法,这非常令人困惑。这应该是清晰的。也许Java应该提供一个@Interface供此处使用。哦,还有Java的另一半特性。


3
在不实现接口时,调用super并不是您始终需要或不想做的事情。有时,您要添加功能-因此,您称之为它。在其他时候,您要替换功能,因此不要调用它。API作者应记录其是否依赖于内部功能,并就如何正确扩展该类创建书面合同。
lilbyrdie 2014年

1

在Java 6和更高版本中,可以将其@Override用于实现接口的方法。

但是,我认为这没有任何意义:覆盖意味着您在超类中拥有一个方法,而您正在子类中实现该方法。

如果您要实现接口,我认为我们应该使用@Implement或其他方法,但不要使用@Override


0

对于接口,使用@Override会导致编译错误。因此,我不得不将其删除。

错误消息“ The method getAllProducts() of type InMemoryProductRepository must override a superclass method”。

它还会显示“ One quick fix available: Remove @Override annotation.

它在Eclipse 4.6.3,JDK 1.8.0_144上。


0

如果正在实现的类interface是一个abstract类,@Override则可用于确保实现是针对某个interface方法使用的;没有 @Overrideabstract类也只是罚款编译即使实现方法签名不匹配的方法在申报interface; 不匹配的interface方法将保持不变。@Zhao引用的Java文档

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.