在阅读有关标记接口的信息时,我偶然发现了以下站点:项目37:使用标记接口定义类型
在这里,根据Joshua Bloch的说法,标记接口比标记注释有两个优点。
1.
标记接口定义了一种由标记的类的实例实现的类型。标记注释没有。这种类型的存在使您可以在编译时捕获错误,而如果使用标记注释,则这些错误在运行时才捕获。2.
标记接口相对于标记注释的另一个优点是可以更精确地定位它们。如果使用target声明了注释类型ElementType.TYPE
,则可以将其应用于任何类或接口。假设您有一个仅适用于特定接口的实现的标记。如果将其定义为标记接口,则可以使其扩展适用于其的唯一接口,从而确保所有标记的类型也是适用于其的唯一接口的子类型。
好,可以理解第一点,但是我不确定我是否正确理解第二点:
如果使用target声明了注释类型
ElementType.TYPE
,则可以将其应用于任何类或接口。
同样,如果我有一个标记器接口,那么它也可以应用于任何类或接口。关于标记注释和标记接口,这不是一回事吗? 标记界面如何更精确地定位?
第二点还提到:
您可以使[Marker Interface]扩展适用于其的唯一接口,并确保所有标记类型也是适用于其的唯一接口的子类型。
您是否还可以通过使用@Inherited
meta-annotation 通过注释实现此目的?
标记界面如何更精确地定位?
您是正确的,两者都可以应用于任何类型。作者“更精确地定位”意味着您可以对标记界面可以应用于的特定类型添加其他限制。不可能对注释添加相同的精确限制:如果注释限制为ElementType.TYPE
,则可以始终将其应用于所有类型。
第二点的另一部分详细介绍了如何添加这些限制。如果您有一个标记器接口,则可以让它扩展另一个接口(作者称之为 唯一接口 ),如下所示:
interface Marker extends Foo { }
标记现在只能应用于实现的类型Foo
。
您是否还可以通过使用
@Inherited
meta-annotation 通过注释实现此目的?
不,@Inherited
元注释仅意味着被注释的类的任何子类型都将被视为也具有相同的注释。它对注释可以应用于的类型没有任何限制。
问题内容: 在阅读有关标记接口的信息时,我偶然发现了以下站点:项目37:使用标记接口定义类型 在这里,根据Joshua Bloch的说法,标记接口比标记注释有两个优点。 1. 标记接口定义了一种由标记的类的实例实现的类型。标记注释没有。这种类型的存在使您可以在编译时捕获错误,而如果使用标记注释,则这些错误在运行时才捕获。 2. 标记接口相对于标记注释的另一个优点是可以更精确地定位它们。如果使用ta
问题内容: 有人可以解释一下Java中标记接口的约定吗? 例如:如果标记界面没有字段/方法,那么定义在哪里? 为什么每次使用时都应实施i / f ? 好吧,我的问题是,如果是类方法,为什么要实现i / f来覆盖。 有人可以详细说明一下Java的这种约定吗? 提前致谢 问题答案: 在所有类的扩展类中定义,但它是。这实际上是一个具体的方法实现,它对对象进行逐字段克隆,但前提是您已实现接口以表明允许这样
有人可以解释一下 java 中标记接口的契约吗? 例如:如果是一个没有字段/方法的标记接口,那么在哪里定义? 为什么每当使用 时,我们都应该实现的 i/f? 好吧,我的问题是,如果是 class的一种方法,为什么要实现 i / f来覆盖 有人能详细说明一下java的这个惯例吗? 提前致谢
我正在学习Struts2,但我并不完全清楚如何以及何时使用标签
Vim的标记系统对于我们是非常有用的。使用强大ctags工具,我们能够在vim中分析 代码生成tags标记。 exVim通过采用 ex-tags 和 ex-symbol 插件进行改善。exVim通过:Update命令生成tags。 选择标记 在vim中可以使用<ctrl-]和:ts tag-name跳转到对应tags。ex-tags 提供同样的办法但是却不同的命令---<leader>] 和:TS
我把(lombok)注释放在一个参数之前,但是如果实现中没有相同的注释,它就不能单独工作。这意味着在实现这个接口的类的方法中,我将需要再次放入这个注释,从而复制代码。 问题是,事情应该是这样吗?如果您只将此注释放在接口中,它们将不起作用,如果您只将其放在实现接口的类中,那么API用户可能不明白不能传递给这些方法。我该怎么办?