Java中的所有注释类型都会自动扩展Annotation接口.因此,Annotation是所有注释的超级接口.它在java.lang.Annotation包中声明.它覆盖了由Object定义的hashCode()、equals()和toString().但是为什么接口能够覆盖对象方法呢?接口必须只包含抽象方法,至少是传统接口.那么,它是在提供某种形式的实现吗?

我访问了Annotation接口的源代码,但所有方法都只声明了,而没有定义.那么为什么要重写

推荐答案

接口方法不能"重写"类中的方法.接口方法只能覆盖其超接口中的接口方法(另请参阅JLS).

java.lang.annotation.Annotation中发生的情况是,Annotation恰好在其接口体中声明了toStringhashCodeequals.声明自己的接口时也可以这样做:

interface MyInterface {
    String toString();
    int hashCode();
    boolean equals(Object other);
}

这通常是多余的,因为所有Object都有这些方法.据推测,Annotation这样做是为了"覆盖"这些方法的文档,讨论这些方法在注释上的行为.例如,hashCode的文档准确地描述了如何生成批注的哈希代码.

例如,当您实际获得带有getAnnotation的注释的实例时:

SomeAnnotation foo = SomeClass.class.getAnnotation(SomeAnnotation.class);

您可以判断foo.getClass(),发现它不是SomeAnnotation,而是实现SomeAnnotation的某个代理类(至少在Java 21中,可能要看实现细节).毕竟,您不能创建接口的实例.

虽然注释接口不覆盖toStringequalshashCode,但您可以说getAnnotation does返回的这个代理类覆盖了它们.

Java相关问答推荐

如何让HikariCP指标在NewRelic中正确显示?

强制Mockito返回null而不是emtpy list

Hibernate 6支持Joda DateTime吗?

如何创建一个2d自上而下的移动系统,其中移动,同时持有两个关键是可能的处理?

从Spring5迁移到Spring6:无法在雅加达包中找到类

Java ArrayList的整数和数组的泛型

Log4j与jdk21兼容吗?

使用多个RemoteDatabase对象的一个线程

在向WebSphere中的文档添加元素时iText挂起

在VS代码中,如何启用Java Main函数的&Q;Run|DEBUG&Q;代码?

为什么我不能建立输入/输出流?Java ServerSocket

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

为什么没有加载java.se模块?

spring 数据Elastic search 与 spring 启动数据Elastic search 之间的区别是什么?

为什么我得到默认方法的值而不是被覆盖的方法的值?

Java中计算大n和k值模10^9+7的二项式系数的乘法公式输出错误值

URI构造函数错误?

为什么child-pom会创建一个新版本

Jackson YAML:支持锚点扩展/覆盖

对于 Hangman 游戏,索引 0 超出长度 0 的范围