今日、私は このドキュメント に続く最初の注釈インターフェイスを作成したかったのですが、このコンパイラエラーが発生しました
Invalid type for annotation member": public @interface MyAnnotation { Object myParameter; ^^^^^^ }
明らかにObject
は注釈メンバーのタイプとして使用できません。残念ながら、一般的に使用できるタイプに関する情報は見つかりませんでした。
これは私が試行錯誤を使用して見つけました:
String
→有効int
→有効Integer
→無効(驚いたことに)String[]
→有効(驚いたことに)Object
→無効おそらく、誰かが実際に許可されているタイプとその理由を明らかにすることができます。
JLSのセクション9.6.1 で指定されています。注釈メンバーのタイプは次のいずれかでなければなりません。
制限されているように見えますが、間違いなく理由があります。
また、多次元配列(たとえば、String[][]
)は、上記の規則によって暗黙的に禁止されていることに注意してください。
利用可能なタイプについては、Skaffmanに同意します。
追加の制限:コンパイル時の定数でなければなりません。
たとえば、次のものは禁止されています。
@MyAnnot("a" + myConstantStringMethod())
@MyAnnot(1 + myConstantIntMethod())
また、注釈自体が注釈定義の一部になる可能性があることも忘れないでください。これにより、いくつかの簡単な注釈のネストが可能になります。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 {};
)
(元のURL: https://blogs.Oracle.com/toddfast/entry/creating_nested_complex_Java_annotations )
アノテーションの概念は、複雑なデータ型をアノテーションに含めることができないことに気付くまで、プロジェクトの設計に非常によく適合しています。そのクラスのインスタンス化されたオブジェクトではなく、インスタンス化したいクラスを使用して回避しました。完全ではありませんが、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
}