2014-10-09 2 views
9

Во время чтения об интерфейсах Маркера я наткнулся на следующем сайте: Item 37: Use marker interfaces to define types
Здесь, по словам Джошуа Блох Есть два преимущества интерфейсов Marker над аннотациями Marker.Маркер Аннотация против Маркера Интерфейс

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

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

ОК, Первая точка понимается, но я не уверен, если я понимаю 2-ю правильно:

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

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

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

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

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

+0

Я отредактировал вопрос, чтобы сделать его немного понятным. Если я слишком сильно изменился, вы, конечно, можете изменить его. – Kapep

ответ

7

Как можно ориентировать интерфейс маркера более точно?

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

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

interface Marker extends Foo { } 

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

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

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

+1

Ответ на ваш вопрос .. Спасибо за объяснение .. – Mac

+0

Я не мог понять эту дискуссию - и вопрос, и ответ ... –

+0

@kapep: Автор - Джошуа Блох пытается сказать, что аннотации не могут быть унаследованы ? –

Смежные вопросы