Интерфейс маркера аннотации против маркера

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

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

  2. другое преимущество интерфейсов маркеров над аннотациями маркеров что они могут быть нацелены более точно. Если тип аннотации объявлен с целью ElementType.TYPE, его можно приложить к любому класс или интерфейс. Предположим, у вас есть маркер, который применяется только для реализации конкретного интерфейса. Если вы определяете его как интерфейс маркера, вы можете расширить подошву интерфейс что он применим, гарантирующ что все маркированные типы также подтипы единственного интерфейса, к которому он применим.

хорошо, первый пункт понят, но я не уверен, правильно ли я понимаю 2-й пункт:

Если тип аннотации объявлен с target ElementType.TYPE, Он может быть применен к любому классу или интерфейсу.

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

во 2-м пункте также упоминается, что:

вы можете [интерфейс маркера] расширить единственный интерфейс, к которому он применим, гарантируя, что все отмеченные типы также являются подтипами единственного интерфейса, к которому он применим.

не можете ли вы также достичь этого с помощью аннотаций, используя @Inherited мета-аннотации?

1 ответов


как интерфейс маркера адресной?

вы правы в том, что оба могут быть применены к любому типу. Под "целевой точнее" автор имеет в виду, что вы можете добавить дополнительные ограничения, к которым могут применяться определенные типы интерфейса маркера. Невозможно добавить те же самые точные ограничения к аннотациям: если аннотация ограничена ElementType.TYPE, то он всегда может быть применен ко всем типам.

другая часть 2-го пункта идет в подробности, как вы можете добавить эти ограничения. Если у вас есть интерфейс маркера, вы можете позволить ему расширить другой интерфейс (который автор называет единственный интерфейс) такой:

interface Marker extends Foo { }

маркер теперь может применяться только к типам, которые реализуют Foo.

Не можете ли вы также достичь этого с помощью аннотаций, используя @Inherited мета-аннотация?

нет,@Inherited meta-annotation означает только, что любой подтип аннотированного класса будет рассматриваться так, как если бы он также имел ту же аннотацию. Он не накладывает никаких ограничений на типы, к которым может применяться аннотация.