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

考虑以下代码:

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

编译错误:

注释值不是允许类型

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

这种行为的原因是什么?

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

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

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

  • 原始类型
  • class级文字
  • 注解
  • 枚举项目
  • 或任何上述的一维arrays

如果在注释类型中声明的方法的返回类型是除以下之一之外的任何类型,则是编译时错误:其中一种基本类型,String,Class和任何类的调用,一个枚举类型(§8.9) ),注释类型或前述类型之一的数组(第10节)。 如果在注释类型中声明的任何方法具有覆盖等同于在类Object或接口annotation.Annotation中声明的任何公共或受保护方法的签名,则它也是编译时错误。

资料来源: JLS

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

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