Java 自定义注释参数化继承其他注释

Java 自定义注释参数化继承其他注释,java,inheritance,annotations,Java,Inheritance,Annotations,我有一个参数化注释(@MiTag1)。我想创建一个新的注释(@MiTag2),它扩展了@MiTag1和其他注释,我想@MiTag1的值被@MiTag2的值“扩展” 在我的代码示例中,@MiTag2(“bla”)必须与@MiTag1(“bla”)相同,但内部没有硬代码“bla” @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface MiTag1 {

我有一个参数化注释(
@MiTag1
)。我想创建一个新的注释(
@MiTag2
),它扩展了
@MiTag1
和其他注释,我想
@MiTag1
的值被
@MiTag2
的值“扩展”

在我的代码示例中,
@MiTag2(“bla”)
必须与
@MiTag1(“bla”)
相同,但内部没有硬代码“bla”

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MiTag1 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MiTag1(value = THIS.VALUE)
public @interface MiTag2 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

Java不允许从其他注释进行扩展。这是经过设计的,因为它将引入一个相当复杂的类型系统。这个问题已经得到了详细的回答,但重要的部分是:

为什么不支持注释子类型(其中一个注释类型 扩展(另一个)

它使注释类型系统复杂化,并使其更加复杂 难以编写“特定工具”

“特定工具”-查询已知注释类型的程序 任意外部程序。例如,存根生成器属于 这一类。这些程序将读取带注释的类,而不使用 将它们加载到虚拟机中,但将加载注释 接口

(pedromarce的原始答复)

若要绕过此问题,可以使用两种注释对目标类型进行注释
@MiTag1@MiTag2
并将应继承注释的默认值设置为父注释的值

此外,您还可以使用组合而不是继承,并将类型为
@MiTag2
的注释添加到
@MiTag2