Java 个库中缺少 @Override

Missing @Override in Java Libraries

被认为是一种很好的做法

use @Override annotation on methods which are being overriden in subclass.

但为什么同样不适用于 Java 库附带的 classes。例如字符串Class。它覆盖了 Object class 的方法,但不在这些方法上使用 @Override 注释。

这样做是为了保持与 Java 之前版本(例如 1.4 等)的向后兼容性

谢谢

这不仅仅是装饰性注释,它在生成文档时很有用,可以通过 Java IDE 提供提示,并明确说明何时重写方法。

从 runtime/standard 库实现者的角度来看,修改所有现有的 classes 只是为了添加一些装饰品是不值得的。

此外,关于一般注释的向后兼容性,考虑到注释是 .class 文件中存在的可选和扩展属性(当它们的保留策略是 CLASSRUNTIME ClassMethod 可用 Runtime(In)VisibleAnnotationsParameter 可用 Runtime(In)VisibleParameterAnnotations)以前的 JVM 版本会在 .class 第一次执行文件解析需要 Class。

但实际上,1.4 JVM class 解析器甚至不会到达那些 Annotation .class 属性位于结构内部的位置,因为当 JVM 注意到.class 版本高于支持的版本。

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

oracle 文档中提到了这一点。

@Override @Override annotation informs the compiler that the element is meant to override an element declared in a superclass. Overriding methods will be discussed in Interfaces and Inheritance.

// mark method as a superclass method // that has been overridden @Override int overriddenMethod() { }

While it is not required to use this annotation when overriding a method, it helps to prevent errors. If a method marked with @Override fails to correctly override a method in one of its superclasses, the compiler generates an error.

在 SO 本身中参考此 discussion

在 API 中,它不会为用户(API)提供太多。然而,当你实现一个方法时,你 'intend' 确实覆盖了一个超级 class 的方法,很容易错过应该匹配的方法签名。

在这种情况下 @Override comes to the rescue as at compile time, it will fail or give a warning when the override does not happen. Also many IDE's recognize the @Override 并为您提供足够的支持,以便在编译之前标记和纠正这些情况。

所以 @Override 实质上声明了您打算让此方法重写某些内容。 API 的用户不会关心你的意图,只要它有效。

其实真正的原因大概是这样的:@Override注解的Retention设置为SOURCE.这意味着 @Override 标志在编译成 class 文件时被丢弃。

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