今天我想在 this documentation 之后创建我的第一个注释接口,但我得到了这个编译器错误
注释成员的类型无效”:public @interface MyAnnotation { Object myParameter; ^^^^^^ }
显然 Object
不能用作注释成员的类型。不幸的是,我找不到任何关于一般可以使用哪些类型的信息。
这是我通过反复试验发现的:
字符串 → 有效
整数 → 有效
整数→无效(令人惊讶)
String[] → 有效(令人惊讶)
对象→无效
也许有人可以阐明哪些类型实际上是允许的以及为什么。
它由 section 9.6.1 of the JLS 指定。注释成员类型必须是以下之一:
原始
细绳
一个枚举
另一个注解
班级
上述任何一项的数组
它看起来确实有限制,但毫无疑问是有原因的。
另请注意,上述规则隐式禁止多维数组(例如 String[][]
)。
如 this answer 中所述,不允许使用 Class 数组。
我同意 Skaffman 的可用类型。
附加限制:它必须是编译时常量。
例如,以下是禁止的:
@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())
也不要忘记注释本身可以是注释定义的一部分。这允许一些简单的注释嵌套 - 在您希望一个注释多次出现的情况下很方便。
例如:
@ComplexAnnotation({
@SimpleAnnotation(a="...", b=3),
@SimpleAnnotation(a="...", b=3),
@SimpleAnnotation(a="...", b=3)
})
public Object foo() {...}
其中 SimpleAnnotation
是
@Target(ElementType.METHOD)
public @interface SimpleAnnotation {
public String a();
public int b();
)
ComplexAnnotation
是
@Target(ElementType.METHOD)
public @interface ComplexAnnotation {
public SimpleAnnotation[] value() default {};
)
(原始网址:https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations)
@Repeatable
中,这不再需要。
注释的概念非常适合我的项目设计,直到我意识到注释中不能有复杂的数据类型。我通过使用我想要实例化的类而不是该类的实例化对象来解决它。它并不完美,但java很少。
@interface Decorated { Class<? extends PropertyDecorator> decorator() }
interface PropertyDecorator { String decorate(String value) }
class TitleCaseDecorator implements PropertyDecorator {
String decorate(String value)
}
class Person {
@Decorated(decorator = TitleCaseDecorator.class)
String name
}
根据 Oracle,注释元素的有效类型是:
1. Primitives (byte, char, int, long float, double)
2. Enums
3. Class (Think generics here Class <?>, Class<? extends/super T>>)
4. String
5. Array of the above (array[] of primitives, enums, String, or Class)
5. Another annotation.
需要注意的是,所有元素本质上都被认为是公共的和抽象的。
所以
static final variable(s) allowed as well.