我有一个参数化注释(在这种情况下为@MiTag1
)。我想创建一个扩展@MiTag2
和其他注释的新注释(@MiTag1
),并且我希望@MiTag1
的值“扩展”为@MiTag2
在我的代码示例中,@MiTag2("bla")
必须与@MiTag1("bla")
相同,但在@MiTag2
中不能包含硬编码“ 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不允许您从另一个注释扩展。这是设计使然,因为它将引入一个相当复杂的类型系统。这个问题已经得到详细解答here,但是重要的部分是:
为什么不支持注释子类型(一种注释类型延伸另一个)?
它使注释类型系统复杂化,并使它更多很难写“特定工具”。
…
“特定工具”-用于查询已知注释类型的程序任意外部程序。存根生成器例如这个类别。这些程序将读取带注释的类,而无需将它们加载到虚拟机中,但将加载注释接口。
(来自[[pedromarce的原始答案)
要避开此问题,您可以使用两个注释来注释目标类型@MiTag1 @MiTag2
并将应该继承
批注的默认值设置为父注释的值。此外,您可以在继承上使用合成,并在@MiTag2
中添加类型为@MiTag2
的注释。