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

soc*_*soc 10 java types annotations default interface

考虑以下代码:

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

编译错误:

注释值不是允许类型

如果我更换FooFooImpl代码被接受.

这种行为的原因是什么?

Sea*_*oyd 7

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

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

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

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

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

资料来源:JLS