次のような、他の注釈をパラメーターとして受け入れるカスタム注釈を (Java を使用して) 作成したいと考えています。
public @interface ExclusiveOr {
Annotation[] value();
}
ただし、これによりコンパイラ エラー「注釈メンバーの型が無効です」が発生します。
Object[] も機能しません。
私がやりたいことをする方法はありますか?
次のような、他の注釈をパラメーターとして受け入れるカスタム注釈を (Java を使用して) 作成したいと考えています。
public @interface ExclusiveOr {
Annotation[] value();
}
ただし、これによりコンパイラ エラー「注釈メンバーの型が無効です」が発生します。
Object[] も機能しません。
私がやりたいことをする方法はありますか?
他の注釈を指定する理由に応じて、複数の解決策があります。
おそらく質問で意図したものではありませんが、単一の注釈型の複数のインスタンスを指定したい場合は、確かに可能です:
public @interface Test {
SomeAnnotation[] value();
}
個々の注釈にパラメータを指定する必要がない場合は、インスタンスの代わりにクラス オブジェクトを使用できます。
public @interface Test {
Class<? extends Annotation>[] value();
}
しかし、もちろん、列挙型もほとんどの状況でうまく機能します。
使用する可能性のあるアノテーション タイプのセットが限られている場合は、それぞれに個別のパラメーターを作成できます。
public @interface Test {
SomeAnnotation[] somes() default { };
ThisAnnotation[] thiss() default { };
ThatAnnotation[] thats() default { };
}
各メンバーにデフォルト値を与えることで、必要な型の配列のみを指定できるようになります。
私自身、ここに特定の問題の回避策を提案します。
さて、私が可能にしたかったのはそのようなものでした:
@Contract({
@ExclusiveOr({
@IsType(IAtomicType.class),
@Or({
@IsType(IListType.class),
@IsType(ISetType.class)
})
})
})
提案された回避策:
次の方法で、パラメーターなしのコンストラクター(後で独自のアノテーションプロセッサーによって呼び出される)を使用してクラスを定義します。
final class MyContract extends Contract{
// parameter-less ctor will be handeled by annotation processor
public MyContract(){
super(
new ExclusiveOr(
new IsType(IAtomicType.class),
new Or(
new IsType(IListType.class),
new IsType(ISetType.class)
)
)
);
}
}
利用方法:
@Contract(MyContract.class)
class MyClass{
// ...
}
できるよ:
Class<? extends Annotation>[] value();
それが役立つかどうかはわかりませんが、. . .