当前位置: 首页 > 知识库问答 >
问题:

标记注释与标记接口

江瀚昂
2023-03-14

在阅读有关标记接口的内容时,我偶然发现了以下网站:第37项:使用标记接口定义类型
根据Joshua Bloch的说法,标记接口比标记注释有两个优点。

>

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

    与标记注释相比,标记接口的另一个优点是可以更精确地定位它们。如果使用targetElementType声明注释类型。键入,它可以应用于任何类或接口。假设您有一个只适用于特定接口实现的标记。如果将其定义为标记接口,则可以让它扩展其适用的唯一接口,从而确保所有标记类型也是其适用的唯一接口的子类型。

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

    如果使用targetElementType声明注释类型。键入,它可以应用于任何类或接口。

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

    第二点还提到:

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

    难道你不能通过使用@Inherited元注释来实现这一点吗?

  • 共有1个答案

    洪育
    2023-03-14

    如何更准确地定位标记接口?

    你是正确的,两者都可以应用于任何类型。通过“更精确地定位”,作者意味着您可以添加额外的限制,标记接口可以应用于哪些特定类型。不可能向注释添加相同的精确限制:如果注释被限制为ElementType。TYPE,那么它总是可以应用于所有类型。

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

    interface Marker extends Foo { }
    

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

    难道你不能通过使用@Inherited元注释来实现这一点吗?

    否,@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用户可能不明白不能传递给这些方法。我该怎么办?