Подтвердить что ты не робот

Может ли Annotation реализовать интерфейсы?

Есть ли возможность реализовать интерфейс в аннотации? Что-то вроде:

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

Ответ 1

Нет, компилятор говорит: "Объявление типа аннотации не может иметь явных суперинтерфейсов".

Вы также не можете расширять: "Объявление типа аннотации не может иметь явный суперкласс".

Ответ 2

Нет, аннотация не может содержать супер-интерфейсы * (хотя интерфейсы могут расширяться из аннотации, а классы могут реализовывать аннотацию, обе из которых являются ужасной практикой imho)

[*] Самое смешное: я не могу найти какой-либо документ, который явно говорит об этом, кроме выхода компилятора java (ни Sun Java Tutorial, а также Спецификация Java 1.5 Annotations)

Ответ 3

Нет, вы не можете (как сказано в моем комментарии). Вы можете использовать делегирование хотя (как сказал AlexR). Однако вам нужно будет использовать перечисление:

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

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

Ответ 4

Короткий ответ No (точно так же, как сказал Тило).

Длинный ответ: если вы действительно хотите, чтобы такая функциональность вы могли использовать делегирование: аннотация может содержать столько, сколько хотите, для полей, которые реализуют столько, сколько хотите интерфейсов. См. Следующий пример:

public interface LevelInterface {
    public int level();
}

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

};

 public @interface NotNull {
     LevelInterface level = foo;
 }