Java 标记注释与标记接口

Java 标记注释与标记接口,java,interface,annotations,Java,Interface,Annotations,在阅读有关Marker接口的文章时,我偶然发现了以下网站: 在这里,根据Joshua Bloch的说法,与标记注释相比,标记接口有两个优点 标记接口定义由的实例实现的类型 标记类;标记注释不需要。这个问题的存在 类型允许您在编译时捕获无法捕获的错误 如果使用标记注释,则在运行时之前捕获 与标记注释相比,标记接口的另一个优点是 他们可以更准确地成为目标。如果注释类型为 使用targetElementType.TYPE声明,它可以应用于任何 类或接口。假设您有一个适用的标记 仅适用于特定接口的实现

在阅读有关Marker接口的文章时,我偶然发现了以下网站:
在这里,根据Joshua Bloch的说法,与标记注释相比,标记接口有两个优点

  • 标记接口定义由的实例实现的类型 标记类;标记注释不需要。这个问题的存在 类型允许您在编译时捕获无法捕获的错误 如果使用标记注释,则在运行时之前捕获

  • 与标记注释相比,标记接口的另一个优点是 他们可以更准确地成为目标。如果注释类型为 使用target
    ElementType.TYPE
    声明,它可以应用于任何 类或接口。假设您有一个适用的标记 仅适用于特定接口的实现。如果你定义它 作为标记接口,您可以让它将唯一接口扩展到 它是适用的,保证所有标记的类型也 它适用的唯一接口的子类型

  • 好的,第一点已经理解,但我不确定我是否正确理解了第二点:

    如果使用target
    ElementType.type
    声明注释类型,则可以将其应用于任何类或接口

    同样,如果我有一个标记接口,那么它也可以应用于任何类或接口。关于标记注释和标记接口,它不是说了同样的事情吗如何更准确地定位标记接口?

    第二点还提到:

    您可以让[Marker Interface]扩展它适用的唯一接口,确保所有标记的类型也是它适用的唯一接口的子类型

    您不能通过使用
    @Inherited
    元注释来实现这一点吗

    如何更准确地定位标记接口?

    这两种方法都可以应用于任何类型,这是正确的。作者所说的“更有针对性”意味着您可以添加额外的限制,将标记接口应用于哪些特定类型。不可能为注释添加相同的精确限制:如果注释被限制为
    ElementType.TYPE
    ,则它始终可以应用于所有类型

    第二点的另一部分详细介绍了如何添加这些限制。如果您有一个标记接口,可以让它扩展另一个接口(作者称之为唯一接口),如下所示:

    interface Marker extends Foo { }
    
    该标记现在只能应用于实现
    Foo
    的类型

    您不能通过使用
    @Inherited
    元注释来实现这一点吗


    否,
    @Inherited
    元注释仅表示注释类的任何子类型都将被视为具有相同注释。它没有对注释可以应用于哪些类型施加任何限制。

    @kapep:作者Joshua Bloch是否试图说注释不能被继承?@akshayrajkore我编辑了这个问题,并试图让我的答案更清楚。现在理解更好吗?我对问题进行了编辑,使其更容易理解。如果我换的太多,你当然可以换回来。