2017-01-26 4 views
0

Jeder Annotationstyp erbt implizit die java.lang.annotation.Annotation Schnittstelle.Was ist der Zweck der Annotation-Schnittstelle?

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

Aber eine Anmerkung erben keine Elemente aus der Annotation-Schnittstelle, die eine implizite Vorfahre aller Annotationstypen ist. Also, wenn ich unten tun, führt zu der Kompilierung Fehler

@CustomAnnotation(toString="toStringValue") 

Könnte jemand mir erklären, dann

was ist der Zweck der Annotation-Schnittstelle? und für was genau es verwendet wird?

+1

Von dem [JLS (9.6.1)] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html#jls-9.6.1): „Es ist ein Fehler bei der Kompilierung, wenn eine in einem Annotation-Typ deklariert Verfahren eine Signatur aufweist, die zu der von einem öffentlichen oder geschützten Methode in der Klasse oder Objekt in der Schnittstelle java.lang.annotation.Annotation deklariert überschreiben-Äquivalent ist.“ so vielleicht ist das der Zweck dieser Schnittstelle (zu erzwingen, dass) –

Antwort

3

Annotation ist eine Schnittstelle. Diese Methoden sind Ihre Standardschnittstelle abstract Methodendeklarationen.

Was Sie in Ihrem Beispiel von

@CustomAnnotation(toString="toStringValue") 

(die Verwendung von toString) beziehen ist ein annotation type element. Dies sind zwei verschiedene Dinge. Letzteres ist eine spezielle Syntax für Annotationstypen. Annotation ist kein Anmerkungstyp, es ist ein Schnittstellentyp.

Was die Annotation Art bietet, ist eine gemeinsame Supertyp für Annotationstypen. So können Sie

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

Diese Methoden (equals, toString und hashCode) werden einfach in die Annotation Schnittstelle neu definiert, ihr Verhalten zu spezifizieren. Sie sind nicht unbedingt erforderlich, da die Java-Sprache implizit adds all those methods to all interface types, wenn sie sie nicht deklarieren.

+0

Annotation Typ ist auch eine Art Schnittstelle mit wenigen Einschränkungen, eines seiner Beschränkung ist, dass keine Vererbung zwischen Annotationstypen erlaubt, was ist der Sinn einen Super Art zu schaffen, dann? –

+0

Was der Annotation-Typ bietet, ist eine gemeinsame Supertyp für Annotationstypen, wenn dies der einzige Zweck ist, warum Annotation keine Marker-Schnittstelle ist ?, Ich bin verwirrt !!! –

+1

@AmitBhati Ein Annotationstyp ist ein Schnittstelle Typ, aber ein Schnittstellentyp ist nicht notwendigerweise ein Annotation-Typ. Es ist keine Marker-Schnittstelle, da die Java-Sprache mehr Verhalten (die "annotationType" -Methode) enthalten und ein spezifischeres Verhalten für die anderen drei Methoden beschreiben möchte. –