2009-09-22 14 views
157

は、今日、私はthis documentation以下の私の最初の注釈インターフェイスを作成したいと私は、コンパイラエラー「注釈メンバーの無効なタイプ」を得た:明らかにJavaアノテーションメンバにはどのような型を使用できますか?

public @interface MyAnnotation { 
    Object myParameter; 
    ^^^^^^ 
} 

Objectは注釈メンバーの型として使用することはできません。残念ながら、どのタイプが一般的に使用できるかについての情報は見つかりませんでした。

この私が試行錯誤を使用して見つけた:

String --> Valid

int --> Valid

Integer --> Invalid (Surprisingly)

String[] --> Valid (Surprisingly)

Object --> Invalid

おそらく誰かがタイプが実際に許可し、なぜされているいくつかの光を当てることができます。

+0

おそらくそれは注釈によって変わります - あなたが書こうとしているコードを示してください。 – djna

+2

質問に追加されました。しかし、私はそれが異なるとは思わない。 –

答えて

226

section 9.6.1 of the JLSで指定します。注釈部材型のいずれかでなければならない:

  • プリミティブ
  • ストリング
  • クラス
  • 列挙
  • 別の注釈
  • 上記

の任意の配列それは制限的なように見えるが、間違いない理由がある。

多次元配列(例:String[][])は、上記の規則によって暗黙のうちに禁止されています。

+17

これらのページ/ドキュメントはどのようにして見つけられますか?私はStackOverlowを尋ねる前に毎回googleを誓っています。多くのJava質問には、私の質問に答えるJSLへのリンクが投稿されています。 Googleでこれらのページを見つけられないのはなぜですか? –

+8

JLSはあまりGoogleに対応していません。あなたはそれがそこにあることを知る必要があります。 – skaffman

+1

sunのサイトの注釈ガイドでも同じ情報が利用できます(グーグルグーグルが見つかりました):http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html – wds

53

私は利用可能なタイプのSkaffmanに同意します。

追加の制限:コンパイル時定数である必要があります。たとえば、次が禁止されている

@MyAnnot("a" + myConstantStringMethod()) 
@MyAnnot(1 + myConstantIntMethod()) 
10

私はあなたが注釈で複雑なデータ型を持つことはできません実現するまでの注釈の概念は、私のプロジェクトの設計と本当によく合います。私はそのクラスのインスタンス化されたオブジェクトではなく、インスタンス化したいクラスのクラスを使用してその周りにいました。完璧ではありませんが、Javaはめったにありません。

@interface Decorated { Class<? extends PropertyDecorator> decorator() } 

interface PropertyDecorator { String decorate(String value) } 

class TitleCaseDecorator implements PropertyDecorator { 
    String decorate(String value) 
} 

class Person { 
    @Decorated(decorator = TitleCaseDecorator.class) 
    String name 
} 
15

はまた注釈自体は、注釈定義の一部であることを忘れないでください。これにより、いくつかの簡単なアノテーションネストが可能になります。アノテーションを何度も表示したい場合に便利です。例えば

@ComplexAnnotation({ 
    @SimpleAnnotation(a="...", b=3), 
    @SimpleAnnotation(a="...", b=3), 
    @SimpleAnnotation(a="...", b=3) 
}) 
public Object foo() {...} 
SimpleAnnotation

@Target(ElementType.METHOD) 
public @interface SimpleAnnotation { 
    public String a(); 
    public int b(); 
) 

ComplexAnnotationから採取

@Target(ElementType.METHOD) 
public @interface ComplexAnnotation { 
    public SimpleAnnotation[] value() default {}; 
) 

例である

https://blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

+3

Java 8 '@ Repeatable'ではこれはもう必要ありません。 – Mordechai

関連する問題