实现接口方法的方法应该用@Override进行注释吗?

Override注释的javadoc说:

指示方法声明要重写超类中的方法声明。如果使用此注释类型注释了方法,但没有重写超类方法,则需要编译器生成错误消息。

我不认为接口在技术上是超类。真的是这样吗?

问题阐述


当前回答

我会利用一切机会。你什么时候使用Java的@Override注释,为什么?

其他回答

JDK 5.0不允许你在实现interface中声明的方法时使用@Override注释(它的编译错误),但JDK 6.0允许。所以你可以根据自己的需求来设置你的项目偏好。

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

如果可以的话,应该总是使用@Override来注释方法。

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

equals(Object) vs. equals(YourObject)的例子是一个标准的例子,但同样的论点也可以用于接口实现。

我想,不强制注释接口的实现方法的原因是JDK 5将其标记为编译错误。如果JDK 6强制使用这个注释,就会破坏向后兼容性。

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

但是,对于这种用法,我更希望看到不同的注释,可能是@Implements注释。

重写从您自己的类继承的方法通常不会破坏使用ide进行重构。但是如果您重写从库继承的方法,建议使用它。如果你不这样做,你通常不会在以后的库更改中得到错误,而是一个隐藏得很好的bug。

这个回答可能太迟了。但是我希望这个例子能够帮助人们理解为什么@override如此重要(对于这样的场景)

public interface Restaurant(){
    public boolean getBill();
    public BigDecimal payAmount();
}

public interface Food() extends Restaurant{
    public boolean haveSomeFood();
    public boolean drinkWater();
}

public class Hungry() implements Food{
    public boolean haveSomeFood(){}
    public boolean drinkWater(){}
    public boolean getBill(){}
    public BigDecimal payAmount(){}
}

在上面的例子中,如果我饿了,我可以从餐馆里吃东西。但如果我拿出餐厅的实现,我不需要得到一个账单,也不需要支付金额!!!!

How?

界面Food有关键字extends Restaurant -这 意味着Hungry类也从接口实现 餐厅。 实际上从接口重写的方法是这样的 没有关键字@override 如果我移除关键字extends 餐厅(或者说如果我删除接口餐厅,它将不会 显示任何错误。

如果有@override,每当我试图删除餐厅界面,它将显示编译错误。

注意:当你实现一个接口时,你可能不知道这个接口是否被扩展到另一个接口,或者可以被扩展,或者继承可能被删除。所以最好使用@override关键字