Java中的所有注解类型都会自动扩展Annotation接口。因此,Annotation 是所有注解的超接口。它在 java.lang.annotation 包中声明。它重写了由Object定义的hashCode()、equals()和toString()。但是接口为什么能够覆盖对象方法呢?接口必须仅包含抽象方法,至少是传统接口。那么它是否提供了某种形式的实现?
我访问了Annotation接口的源代码,但是所有方法都只是声明而没有定义。那么为什么要覆盖
接口方法不能“覆盖”类中的方法。接口方法只能覆盖其超级接口中的接口方法(另见JLS)。
java.lang.annotation.Annotation
中发生的事情是,Annotation
恰好在其接口主体中声明了toString
、hashCode
和equals
。您也可以在声明自己的接口时执行此操作:
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 中,可能取决于实现细节)。毕竟,您无法创建接口的实例。
虽然注释接口不会覆盖
toString
、equals
和 hashCode
,但您可以说 getAnnotation
返回的代理类确实 覆盖了它们。