缺少Java库中的@Override

Ank*_*kit 7 java inheritance jvm annotations

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

对正在子类中重写的方法使用@Override注释.

但是为什么同样没有应用于Java库附带的类.例如String Class.它会覆盖Object类的方法,但不会对这些方法使用@Override注释.

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

谢谢

YoY*_*oYo 5

在 API 中,它不会为(该 API 的)用户提供太多东西。但是,当您实现一个方法并且您“打算”覆盖超类的方法时,很容易错过应该匹配的方法签名。

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

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

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

@Target(value=METHOD)
 @Retention(value=SOURCE)
public @interface Override
Run Code Online (Sandbox Code Playgroud)


Umb*_*ndi 4

这只不过是一个装饰性注释,它在生成文档、通过 Java IDE 提供提示以及显式声明方法何时被重写时非常有用。

从运行时/标准库实现者的角度来看,仅仅为了添加一些装饰性的东西而修改所有现有的类是不值得的。

此外,关于注释的向后兼容性,考虑到注释是.class文件中存在的可选和扩展属性(当它们的保留策略是CLASSorRUNTIME且可用于 and asClass和for as时),以前版本的 JVM 将在执行期间简单地忽略该属性。第一次需要该类时执行文件解析。MethodRuntime(In)VisibleAnnotationsParameterRuntime(In)VisibleParameterAnnotations.class

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