Java中的所有注释类型都会自动扩展Annotation接口.因此,Annotation是所有注释的超级接口.它在java.lang.Annotation包中声明.它覆盖了由Object定义的hashCode()、equals()和toString().但是为什么接口能够覆盖对象方法呢?接口必须只包含抽象方法,至少是传统接口.那么,它是在提供某种形式的实现吗?
我访问了Annotation接口的源代码,但所有方法都只声明了,而没有定义.那么为什么要重写
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
does返回的这个代理类覆盖了它们.