标记注释与标记界面

在阅读Marker接口时,我偶然发现了以下网站: 第37项:使用标记接口来定义类型
根据Joshua Bloch的说法,Marker接口相对于Marker注释有两个优点。

  1. 标记接口定义由标记类的实例实现的类型; 标记注释没有。 此类型的存在允许您在编译时捕获错误,如果使用标记注释,则在运行时无法捕获这些错误。

  2. 标记界面相对于标记注释的另一个优点是可以更精确地定位它们。 如果使用目标ElementType.TYPE声明注释类型,则可以将其应用于任何类或接口。 假设您有一个仅适用于特定接口实现的标记。 如果将其定义为标记接口,则可以使其扩展到适用的唯一接口,从而保证所有标记类型也是适用的唯一接口的子类型。

好的,第一点被理解,但我不确定我是否正确理解第二点:

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

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

第二点还提到:

您可以[标记接口]扩展适用的唯一接口,保证所有标记类型也是适用的唯一接口的子类型。

您是否也可以通过使用@Inherited元注释来实现注释

如何更精确地定位标记界面?

你是对的,两者都适用于任何类型。 通过“更准确地定位”,作者意味着您可以添加其他限制,以便可以将标记界面应用于哪些特定类型。 无法对注释添加相同的精确限制:如果注释仅限于ElementType.TYPE ,则它始终可以应用于所有类型。

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

 interface Marker extends Foo { } 

该标记现在只能应用于实现Foo类型。

您是否也可以通过使用@Inherited元注释来实现注释

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