web-dev-qa-db-ja.com

Java注釈メンバーに使用できる型はどれですか?

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

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

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

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

  • String→有効
  • int→有効
  • Integer→無効(驚いたことに)
  • String[]→有効(驚いたことに)
  • Object→無効

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

207
Daniel Rikowski

JLSのセクション9.6.1 で指定されています。注釈メンバーのタイプは次のいずれかでなければなりません。

  • 原始的な
  • ひも
  • クラス
  • 列挙
  • 別の注釈
  • 上記のいずれかの配列

制限されているように見えますが、間違いなく理由があります。

また、多次元配列(たとえば、String[][])は、上記の規則によって暗黙的に禁止されていることに注意してください。

291
skaffman

利用可能なタイプについては、Skaffmanに同意します。

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

たとえば、次のものは禁止されています。

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

また、注釈自体が注釈定義の一部になる可能性があることも忘れないでください。これにより、いくつかの簡単な注釈のネストが可能になります。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

24
fikovnik

アノテーションの概念は、複雑なデータ型をアノテーションに含めることができないことに気付くまで、プロジェクトの設計に非常によく適合しています。そのクラスのインスタンス化されたオブジェクトではなく、インスタンス化したいクラスを使用して回避しました。完全ではありませんが、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
}
11
Josh