【问题标题】:Why are interfaces not allowed as annotation members?为什么不允许接口作为注释成员?
【发布时间】:2011-11-01 22:27:57
【问题描述】:

考虑这段代码:

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

编译器错误:

注释值不是允许的类型

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

这种行为的原因是什么?

【问题讨论】:

    标签: java types interface annotations default


    【解决方案1】:

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

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

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

    • 原始类型
    • 字符串
    • 类文字
    • 注释
    • 枚举项
    • 或上述任何一个的一维数组

    如果方法的返回类型在 注释类型是以下之一以外的任何类型:其中之一 原始类型、String、Class 和 Class 的任何调用,一个 枚举类型(第 8.9 节)、注释类型或其中之一的数组(第 10 节) 前面的类型。如果有任何方法,这也是编译时错误 在注解类型中声明的签名是 覆盖 - 等效于声明的任何公共或受保护方法 在 Object 类或接口 annotation.Annotation 中。

    来源:JLS

    【讨论】:

      【解决方案2】:

      http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.7

      注解成员类型必须是以下之一:原始、字符串、类、枚举、上述任何一种的数组

      如果元素类型与 ElementValue 不相称,则为编译时错误。

      希望这会有所帮助!

      在本文档中也发现了相同的内容:

      http://download.oracle.com/javase/1.5.0/docs/guide/language/annotations.html

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

      【讨论】:

      • 我完成了第一句话,第二句话似乎是问题所在。我想知道为什么注释中不允许这样做...
      • @soc 我完成了第一句话不,你没有。 Class<? extends Foo> fooType() 有效,Foo foo() 无效。
      • 将 Foo Foo() 视为一种方法(只是为了简单起见)...我们可以将接口作为方法的返回类型吗? :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多