注解可以实现接口吗?

26

有没有可能在注解中实现接口?就像这样:

public @interface NotNull implements LevelInterface  {
    ValidationLevel level();
};

不,没有。你会用它来做什么? - sfussenegger
2
请不要使用 <pre> 格式化代码块。选择一个代码块,然后点击带有两个花括号的按钮(或按下ctrl+k)。 - Sean Patrick Floyd
4个回答

18

不,编译器提示:

注解类型声明不能具有显式的超级接口

您也无法扩展:

注解类型声明不能具有显式的超类


13

不,注解不能有超级接口*(虽然接口可以从注解继承,并且类可以实现注解,但我认为这两种做法都很糟糕)

[*] 有趣的是:我找不到任何明确说明这一点的文件,除了Java编译器输出之外(既不是Sun Java教程,也不是Java 1.5注解规范


6

不可以,正如我在评论中所说。但是,您可以使用委托(如AlexR所说)。但是,您必须使用枚举:

public enum LevelEnum implements LevelInterface {
  DEFAULT {
    public ValidationLevel level() {
      // SNIP (your code)
    }
  };
}

public @interface NotNull {
  LevelEnum level() default LevelEnum.DEFAULT;
}

1
这段代码无法编译。你必须使用 LevelEnum level() default LevelEnum.DEFAULT; 。你不能使用接口作为类型,并传入实现该接口的不同枚举值。 - Sean Patrick Floyd
@sean 当然没错。这就是为什么复制粘贴代码(从您的评论到AlexR的回复)是一件坏事(商标)的原因之一 :) - sfussenegger

1

简短的回答是不行的(就像Thilo所说的一样)。

长的回答是,如果你真的希望有这样的功能,你可以使用委托:注释可以持有任意数量实现任意数量接口的字段。请参考以下示例:

public interface LevelInterface {
    public int level();
}

public static LevelInterface foo = new LevelInterface() {
    @Override
    public int level() {
        return 123;
    }

};

 public @interface NotNull {
     LevelInterface level = foo;
 }

4
这没有任何影响(无法访问这样的字段)。注释成员是方法而不是字段,并且它们的类型必须是编译时常量:字符串、基本数据类型、类、枚举、其他注释或这些类型的数组。如果你想使用 @NotNull(level=Something),你必须像这样声明 level:LevelInterface level() default foo; 但正如我之前所说,这不会编译通过(LevelInterface 和 foo 都无效)。参考资料 - Sean Patrick Floyd
1
请在您所说的内容中展示一个可行的示例(或链接到一个)。根据注释参考返回类型仅限于基本类型、字符串、类、枚举、注释和前述类型的数组。 因此,是的,类型可以是实现接口的枚举,但不能是接口本身。 - Sean Patrick Floyd
您的答案通常都非常好,但这一个不太好。请修正或删除它。 - Sean Patrick Floyd
1
虽然这是可编译的,level = foo; 成为了一个public static final,类似于在普通接口中声明“字段”。 - Simon Forsberg
请使用注释:`import Whatever.NotNull;@NotNull public class Bar {}` - maxxyme
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接