标记注释与标记界面

时间:2014-10-09 06:33:01

标签: java interface annotations

在阅读Marker界面时,我偶然发现了以下网站:Item 37: Use marker interfaces to define types
根据Joshua Bloch的说法,Marker接口相对于Marker注释有两个优点。

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

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

  4.   

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

  

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

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

第二点还提到:

  

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

使用@Inherited元注释,您是否也可以通过注释实现此目的?

1 个答案:

答案 0 :(得分:9)

  

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

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

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

interface Marker extends Foo { }

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

  

使用@Inherited元注释,您是否也可以通过注释实现此目的?

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