缺少Java库中的@Override

时间:2015-05-05 08:57:36

标签: java inheritance annotations jvm

这被认为是一种很好的做法

  

覆盖的方法使用 @Override 注释   子类。

但是为什么同样的问题不适用于Java库附带的类。对于例如字符串类。它会覆盖Object类的方法,但不会对这些方法使用 @Override 注释。

这是为了保持与先前版本的Java(如1.4等)的向后兼容性。

由于

2 个答案:

答案 0 :(得分:4)

在API中,它对用户(该API)没有太多帮助。但是,当您实施一种方法时,您就打算这样做了。如果覆盖超类的那个,很容易错过方法签名,这应该匹配。

在这种情况下,@Override在编译时拯救,当覆盖时,它将失败或发出警告。此外,许多IDE都能识别@Override,并为您提供足够的支持,以便在编译之前标记和纠正这些情况。

所以@Override本质上声明了你的意图,即这个方法会覆盖某些东西。只要有效,API的用户就会关心你的意图。

实际上,可能真正的原因是:Retention注释的@Override设置为SOURCE。这意味着在编译成类文件时会丢弃@Override标志。

@Target(value=METHOD)
 @Retention(value=SOURCE)
public @interface Override

答案 1 :(得分:2)

@override注释用于提供一些额外的信息,主要是在生成文档时,以及通知开发人员代码打算覆盖超类中的方法。

oracle文档中提到了这一点。

  

@Override @Override注释通知编译器该元素   用于覆盖超类中声明的元素。重写   方法将在Interfaces and Inheritance中讨论。

     

//将方法标记为超类方法//已经存在   重写@Override int overriddenMethod(){}

     

虽然在覆盖a时不需要使用此注释   方法,它有助于防止错误。如果方法标有@Override   无法正确覆盖其超类之一的方法,   编译器生成错误。

请参阅SO本身中的discussion