Javaアノテーションメンバーにはどのタイプを使用できますか?


238

今日、このドキュメントに従って最初の注釈インターフェイスを作成したかったのですが、このコンパイラエラーが発生しました

Invalid type for annotation member":
public @interface MyAnnotation {
    Object myParameter;
    ^^^^^^
}

もちろんObject、アノテーションメンバーのタイプとして使用することはできません。残念ながら、一般的に使用できるタイプに関する情報は見つかりませんでした。

これは私が試行錯誤して見つけたものです:

  • String →有効
  • int →有効
  • Integer →無効(驚くほど)
  • String[] →有効(意外)
  • Object →無効

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


おそらくアノテーションによって異なります-記述しようとしているコードを示してください。
djna 2009

2
質問に追加しました。しかし、私はそれが変わるとは思いません。
Daniel Rikowski、2009

回答:


324

JLSのセクション9.6.1で指定されています。アノテーションメンバータイプは次のいずれかである必要があります。

  • 原始的
  • ストリング
  • 列挙型
  • 別の注釈
  • クラス
  • 上記のいずれかの配列

制限的なように見えますが、それには理由があります。

また、多次元配列(などString[][])は、上記のルールによって暗黙的に禁止されています。

この回答に記載されているように、クラスの配列は許可されていません。


33
それらのページ/ドキュメントをどのように見つけるのですか?StackOverlowや多くのJavaの質問を尋ねる前に、いつもGoogleがGoogleの質問に答えるJSLへのリンクを投稿することを誓います。Googleでそれらのページが見つからないのはなぜですか?
Daniel Rikowski、2009

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

1
同じ情報は、Sun
wds

1
はい、私もそのページを見つけましたが、私はその文章を見逃していたはずです。もっとテーブルやリストのようなものを探しました。
ダニエルリコウスキー

13
上記のリストに欠けているのは「注釈」です。別のアノテーションまたは別のアノテーションの配列を含むアノテーションを持つことができます。
Matt

58

私は利用可能なタイプについてスカフマンに同意します。

追加の制限:コンパイル時の定数でなければなりません

たとえば、以下は禁止されています。

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

31

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

例えば:

@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 {};
)

例:http : //web.archive.org/web/20131216093805/https : //blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations

(元のURL:https : //blogs.oracle.com/toddfast/entry/creating_nested_complex_java_annotations


6
Java 8 @Repeatableでは、これはもう必要ありません。
モルデチャイ2017年

11

注釈の概念は、注釈に複雑なデータ型を含めることができないことに気付くまで、プロジェクトの設計に非常によく適合しています。そのクラスのインスタンス化されたオブジェクトではなく、インスタンス化したいもののクラスを使用して回避しました。完璧ではありませんが、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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.