在阅读Marker界面时,我偶然发现了以下网站:Item 37: Use marker interfaces to define types
根据Joshua Bloch的说法,Marker接口相对于Marker注释有两个优点。
标记接口定义由实例实现的类型 标记的类;标记注释没有。这个存在 type允许您在编译时捕获您无法捕获的错误 如果使用标记注释,则捕获到运行时。
- 醇>
标记接口相对于标记注释的另一个优点是 他们可以更精确地定位。如果是注释类型 使用目标
ElementType.TYPE
声明,它可以应用于任何目标 类或接口。假设您有一个适用的标记 仅限于特定接口的实现。如果你定义它 作为标记界面,您可以将它扩展到唯一的界面 它适用,保证所有标记类型也是 它适用的唯一界面的子类型。
好的,第一点被理解,但我不确定我是否正确理解第二点:
如果使用目标
ElementType.TYPE
声明注释类型,则可以将其应用于任何类或接口。
同样,如果我有一个标记接口,那么它也可以应用于任何类或接口。是不是对标记注释和标记界面说了同样的话? 如何更精确地定位标记界面?
第二点还提到:
您可以[标记接口]扩展适用的唯一接口,保证所有标记类型也是适用的唯一接口的子类型。
使用@Inherited
元注释,您是否也可以通过注释实现此目的?
答案 0 :(得分:9)
如何更精确地定位标记界面?
你是对的,两者都适用于任何类型。通过“更精确地定位”,作者意味着您可以添加其他限制,以便可以将标记界面应用于哪些特定类型。无法对注释添加相同的精确限制:如果注释仅限于ElementType.TYPE
,则它始终可以应用于所有类型。
第二点的另一部分详细介绍了如何添加这些限制。如果你有一个标记界面,你可以让它扩展另一个界面(作者称之为唯一界面),如下所示:
interface Marker extends Foo { }
标记现在只能应用于实现Foo
的类型。
使用
@Inherited
元注释,您是否也可以通过注释实现此目的?
不,@Inherited
元注释仅表示注释类的任何子类型都将被视为具有相同的注释。它不对可以应用注释的类型施加任何限制。