Прочитав о интерфейсах Marker, я наткнулся на следующий сайт: Пункт 37: Использовать интерфейсы маркеров для определения типов
Здесь, по словам Джошуа Блоха, есть два преимущества интерфейсов Marker над аннотациями Marker.
Интерфейсы маркеров определяют тип, который реализуется экземплярами маркированный класс; маркерных аннотаций нет. Существование этого type позволяет вам ловить ошибки во время компиляции, которые вы не могли если вы использовали аннотацию маркера.
Еще одно преимущество интерфейсов маркеров над аннотациями маркеров что они могут быть нацелены более точно. Если тип аннотации объявленный с таргетингом
ElementType.TYPE
, он может быть применен к любому класса или интерфейса. Предположим, что у вас есть маркер, который применим только для реализаций определенного интерфейса. Если вы его определите как интерфейс маркера, вы можете расширить его интерфейс до который он применим, гарантируя, что все маркированные типы также подтипы единственного интерфейса, к которому он применим.
ОК, первая точка понята, но я не уверен, правильно ли понял второй пункт:
Если тип аннотации объявлен с целевым
ElementType.TYPE
, он может применяться к любому классу или интерфейсу.
Аналогично, если у меня есть интерфейс маркера, это тоже можно применить к любому классу или интерфейсу. Разве это не говорит то же самое о маркерных аннотациях и интерфейсах маркеров? Как можно ориентировать интерфейс маркера более точно?
Второй пункт также указывает, что:
вы можете иметь [Интерфейс Маркера] расширить интерфейс, к которому он применим, гарантируя, что все отмеченные типы также являются подтипами единственного интерфейса, к которому он применим.
Не можете ли вы также достичь этого с помощью аннотаций, используя мета-аннотацию @Inherited
?