考虑以下代码:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Bar {
Foo foo() default FooImpl.FooConstant;
}
编译错误:
注释值不是允许类型
如果我将Foo
替换为FooImpl
,则会接受代码。
这种行为的原因是什么?
答案 0 :(得分:7)
如果我用FooImpl替换Foo,则接受代码。
如果编译,我会非常惊讶,除非FooImpl是枚举。
注释成员只能包含以下内容:
如果声明的方法的返回类型,则是编译时错误 注释类型是除以下之一之外的任何类型:其中之一 原始类型,String,Class和Class的任何调用,a 枚举类型(第8.9节),注释类型或其中一个的数组(第10节) 前面的类型。如果有任何方法,它也是编译时错误 在注释类型中声明的签名是 override - 等同于声明的任何公共或受保护方法的覆盖 在类Object或接口annotation.Annotation中。
来源:JLS
答案 1 :(得分:3)
http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7
注释成员类型必须是以下之一:primitive,String,Class,Enum,以上任何一个数组
如果元素类型与ElementValue不相称,则为编译时错误。
希望这有帮助!
在本文档中也发现了相同内容:
http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html
“返回类型仅限于基元,字符串,类,枚举,注释和前面类型的数组。”如上所述,“接口”是不允许的。