标记注释与标记界面

Mac*_*Mac 15 java annotations interface

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

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

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

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

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

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

第二点还提到:

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

你不能通过使用@Inherited元注释来实现注释吗?

kap*_*pex 10

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

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

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

interface Marker extends Foo { }
Run Code Online (Sandbox Code Playgroud)

标记现在只能应用于实现的类型Foo.

你不能通过使用@Inherited元注释来实现注释吗?

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