пользовательские аннотации параметризованные наследуют другие аннотации - PullRequest
0 голосов
/ 25 октября 2019

У меня есть одна параметризованная аннотация (в данном случае @MiTag1). И я хочу создать новую аннотацию (@MiTag2), которая расширяет @MiTag1 и другие аннотации, и я хочу, чтобы значение @MiTag1 "было расширено" на значение @MiTag2

В моем примере кода @MiTag2("bla") должен быть таким же, как @MiTag1("bla"), но без жесткого кода "bla" внутри @MiTag2.

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MiTag1 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@MiTag1(value = THIS.VALUE)
public @interface MiTag2 {

    /**
     * The resource key.
     *
     * @see Resources
     */
    String value();
}

1 Ответ

0 голосов
/ 25 октября 2019

Java не позволяет вам расширять другие аннотации. Это разработано, поскольку это ввело бы довольно сложную систему типов. На этот вопрос был дан подробный ответ здесь , но важными частями являются:

Почему вы не поддерживаете подтип аннотации (когда один тип аннотации расширяет другой)?

Это усложняет систему типов аннотаций и значительно затрудняет написание «Конкретных инструментов».

«Конкретные инструменты» - Программы, которые запрашивают известные типы аннотаций произвольных внешнихпрограммы. Например, генераторы-заглушки попадают в эту категорию. Эти программы будут читать аннотированные классы без загрузки их в виртуальную машину, но будут загружать интерфейсы аннотаций.

(оригинальный ответ от pedromarce )

Чтобы обойти этопроблема, вы можете либо аннотировать ваш целевой тип с обеими аннотациями @MiTag1 @MiTag2 и установить значение по умолчанию , если наследует аннотация к значению родительской аннотации .

Кроме того, вы можете использовать композицию поверх наследования и добавить аннотацию типа @MiTag2 к @MiTag2.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...