标记注释与标记界面
在阅读Marker接口时,我偶然发现了以下网站: 第37项:使用标记接口来定义类型
根据Joshua Bloch的说法,Marker接口相对于Marker注释有两个优点。
标记接口定义由标记类的实例实现的类型; 标记注释没有。 此类型的存在允许您在编译时捕获错误,如果使用标记注释,则在运行时无法捕获这些错误。
标记界面相对于标记注释的另一个优点是可以更精确地定位它们。 如果使用目标
ElementType.TYPE
声明注释类型,则可以将其应用于任何类或接口。 假设您有一个仅适用于特定接口实现的标记。 如果将其定义为标记接口,则可以使其扩展到适用的唯一接口,从而保证所有标记类型也是适用的唯一接口的子类型。
好的,第一点被理解,但我不确定我是否正确理解第二点:
如果使用目标
ElementType.TYPE
声明注释类型,则可以将其应用于任何类或接口。
同样,如果我有一个标记接口,那么它也可以应用于任何类或接口。 是不是对标记注释和标记界面说了同样的话? 如何更精确地定位标记界面?
第二点还提到:
您可以[标记接口]扩展适用的唯一接口,保证所有标记类型也是适用的唯一接口的子类型。
您是否也可以通过使用@Inherited
元注释来实现注释 ?
如何更精确地定位标记界面?
你是对的,两者都适用于任何类型。 通过“更准确地定位”,作者意味着您可以添加其他限制,以便可以将标记界面应用于哪些特定类型。 无法对注释添加相同的精确限制:如果注释仅限于ElementType.TYPE
,则它始终可以应用于所有类型。
第二点的另一部分详细介绍了如何添加这些限制。 如果你有一个标记界面,你可以让它扩展另一个界面(作者称之为唯一的界面 ),如下所示:
interface Marker extends Foo { }
该标记现在只能应用于实现Foo
类型。
您是否也可以通过使用
@Inherited
元注释来实现注释 ?
不,@ @Inherited
元注释仅表示注释类的任何子类型都将被视为具有相同的注释。 它不会对可以应用注释的类型施加任何限制。
- 哪一个更快? List.contains()或Map.containsKey()
- Java正则表达式匹配花括号 – “无效的转义序列”
- Hibernate比sql查询慢1000倍
- 在Jenkins haedless浏览器中:org.openqa.selenium.WebDriverException:与远程浏览器通信时出错。 它可能已经死了
- 泽西岛的身份validation
- 来自apache-commons exec的进程输出
- 为什么我在创建Map时会收到IllegalArgumentException?
- 类“”nether有一个main方法,也没有在web.xml文件中指定的servlet
- 参数化类型是什么意思?