Java Annotation 接口如何覆盖对象类中的方法

问题描述 投票:0回答:1

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

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

java interface annotations
1个回答
0
投票

接口方法不能“覆盖”类中的方法。接口方法只能覆盖其超级接口中的接口方法(另见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
返回的代理类确实 覆盖了它们。

© www.soinside.com 2019 - 2024. All rights reserved.