2017-01-26 7 views
0

Каждый тип аннотации неявно наследует интерфейс java.lang.annotation.Annotation.Какова цель интерфейса аннотаций?

package java.lang.annotation; 
public interface Annotation{ 
    boolean equals(Object obj); 
    int hashCode(); 
    String toString(); 
    Class<? extends Annotation> annotationType(); 
} 

Но аннотация не наследует все элементы из интерфейса аннотаций, который является неявным предком всех типов аннотаций. Так что, если я ниже, приведет к компиляции ошибки времени

@CustomAnnotation(toString="toStringValue") 

Может кто-нибудь объяснить мне, то

какова цель интерфейса аннотаций? и для чего именно это ?

+1

Из [JLS (9.6.1)] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.1): «Это ошибка времени компиляции, если какой-либо метод, объявленный в типе аннотации, имеет подпись, переопределяющую эквивалентную любому общедоступному или защищенному методу, объявленному в классе Object или в интерфейсе java.lang.nnotation.Annotation. " так что, возможно, это цель этого интерфейса (для обеспечения этого) –

ответ

3

Annotation - это интерфейс. Эти методы - ваш стандартный интерфейс abstract.

Что вы имеете в виду в вашем примере

@CustomAnnotation(toString="toStringValue") 

(использование toString) является annotation type element. Это две разные вещи. Последний является специальным синтаксисом для типов аннотаций. Annotation не является типом аннотации, это тип интерфейса.

Что обеспечивает тип Annotation, является обычным супертипом для типов аннотаций. Таким образом, вы можете сделать

Annotation custom = SomeClass.class.getAnnotation(CustomAnnotation.class); 
custom.annotationType(); 

Эти методы (equals, toString и hashCode) просто переопределены в интерфейсе Annotation указать их поведение. Они не являются строго обязательными, поскольку язык Java неявно adds all those methods to all interface types, если они не объявляют их.

+0

Тип аннотации также является своего рода интерфейсом с несколькими ограничениями, одним из его ограничений является то, что между типами аннотаций не допускается наследование, что значит создать супер-тип? –

+0

Что представляет собой тип аннотации, является общим супертипом для типов аннотаций, если это единственная цель, почему Annotation не является интерфейсом маркера ?, я в замешательстве !!! –

+1

@AmitBhati Тип аннотации - это тип интерфейса, но тип интерфейса не обязательно является типом аннотации. Это не интерфейс маркера, потому что язык Java хочет включить больше поведения (метод annotationType) и описать более конкретное поведение для других 3 методов. –