Ошибка установки значения аннотации как класса <?> Из константы, почему?

2

Это моя аннотация:

@Target( { ElementType.METHOD } )
@Retention(RetentionPolicy.RUNTIME)
public @interface AuditUpdate
{
    Class<?> value();
}

Таким образом, это нормально:

@AuditUpdate(User.class)
void someMethod(){}

Но так:

private static final Class<?> ENTITY_CLASS = User.class;
@AuditUpdate(ENTITY_CLASS)
void someMethod(){}

У меня есть эта ошибка компиляции:

The value for annotation attribute AuditUpdate.value must be a class literal

Почему? Что это значит?

Спасибо.

Теги:
annotations

1 ответ

5
Лучший ответ

Это означает, что вы должны передать литерал класса, а не переменную (даже если константа).

Литерал класса хорошо определен в JLS:

15.8.2 Литералы классов

Литерал класса - это выражение, состоящее из имени класса, интерфейс, массив или примитивный тип, за которым следует `. ' и токен класс. Тип литерала класса - это класс. Он оценивает класс объект для именованного типа (или для void), как определено определяющим класс загрузчика класса текущего экземпляра.

Итак, вы не можете этого сделать.

  • 0
    Хорошо спасибо. Any Это какая-то причина для этого? Это раздражает.
  • 4
    @francadaval - информация для аннотации разрешается во время компиляции, и то, что вы делаете, требует запуска статической инициализации, чтобы определить значение класса. Чтобы довести это до крайности - что если вы имел: ... ENTITY_CLASS = pick_my_class (); вместо? Теперь компилятор должен каким-то волшебным образом знать, что будет возвращено. Они решили разрешить только литералы, потому что компилятор может просто разрешить это.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню