2017-01-26 1 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.annotation.Annotationインタフェースで宣言されたパブリックメソッドまたは保護されたメソッドのオーバーライド同等のシグネチャを持つ場合、コンパイル時エラー。それはおそらくこのインタフェースの目的です(それを強制するため) –

答えて

3

Annotationはインターフェイスです。これらのメソッドは標準インターフェースのabstractメソッド宣言です。あなたは

@CustomAnnotation(toString="toStringValue") 

toStringの使用)のあなたの例では、を参照している何

annotation type elementです。これらは2つの異なるものです。後者は、注釈タイプの特殊な構文です。 Annotationはアノテーションタイプではなく、インターフェイスタイプです。

Annotationタイプが提供するものは、アノテーションタイプの共通のスーパータイプです。ですから、

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

これらのメソッド(equalstoString、およびhashCode)を行うことができ、単純に自分の動作を指定するAnnotationインターフェイスで再定義されています。 Java言語が暗黙的にadds all those methods to all interface typesを宣言していないため、厳密には必要ではありません。

+0

注釈のタイプはいくつかの制限を持つ一種のインタフェースですが、その制限の1つは、注釈のタイプ間での継承が許されないということです。 –

+0

注釈タイプが提供するものは、注釈タイプの共通のスーパータイプです。これが唯一の目的である場合、注釈がマーカーインターフェイスではない理由は何ですか、私は混乱しています! –

+1

@AmitBhati注釈型はインタフェース型ですが、インタフェース型は必ずしも注釈型ではありません。 Java言語はより多くの振舞い( 'annotationType'メソッド)を含み、他の3つのメソッドに対してより具体的な振る舞いを記述したいので、これはマーカーインタフェースではありません。 –

関連する問題