为什么不允许接口作为注释成员?

时间:2011-08-23 12:43:43

标签: java types interface annotations default

考虑以下代码:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Bar {
    Foo foo() default FooImpl.FooConstant;
}

编译错误:

  

注释值不是允许类型

如果我将Foo替换为FooImpl,则会接受代码。

这种行为的原因是什么?

2 个答案:

答案 0 :(得分:7)

  

如果我用FooImpl替换Foo,则接受代码。

如果编译,我会非常惊讶,除非FooImpl是枚举。

注释成员只能包含以下内容:

  • 原始类型
  • 字符串
  • Class literal
  • 注释
  • 枚举项目
  • 或上述任何一个的一维阵列
  

如果声明的方法的返回类型,则是编译时错误   注释类型是除以下之一之外的任何类型:其中之一   原始类型,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

“返回类型仅限于基元,字符串,类,枚举,注释和前面类型的数组。”如上所述,“接口”是不允许的。