10

次のような、他の注釈をパラメーターとして受け入れるカスタム注釈を (Java を使用して) 作成したいと考えています。

public @interface ExclusiveOr {
    Annotation[] value();
}

ただし、これによりコンパイラ エラー「注釈メンバーの型が無効です」が発生します。

Object[] も機能しません。

私がやりたいことをする方法はありますか?

4

5 に答える 5

4

他の注釈を指定する理由に応じて、複数の解決策があります。

単一の注釈型のインスタンスの配列

おそらく質問で意図したものではありませんが、単一の注釈型の複数のインスタンスを指定したい場合は、確かに可能です:

public @interface Test {
    SomeAnnotation[] value();
}

インスタンスではなく、注釈型の配列

個々の注釈にパラメータを指定する必要がない場合は、インスタンスの代わりにクラス オブジェクトを使用できます。

public @interface Test {
    Class<? extends Annotation>[] value();
}

しかし、もちろん、列挙型もほとんどの状況でうまく機能します。

複数の配列を使用する

使用する可能性のあるアノテーション タイプのセットが限られている場合は、それぞれに個別のパラメーターを作成できます。

public @interface Test {
    SomeAnnotation[] somes() default { };
    ThisAnnotation[] thiss() default { };
    ThatAnnotation[] thats() default { };
}

各メンバーにデフォルト値を与えることで、必要な型の配列のみを指定できるようになります。

于 2013-03-18T10:54:18.083 に答える
2

私自身、ここに特定の問題の回避策を提案します。

さて、私が可能にしたかったのはそのようなものでした:

@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{
    // ...
}
于 2009-03-24T23:47:46.423 に答える
1

できるよ:

Class<? extends Annotation>[] value();

それが役立つかどうかはわかりませんが、. . .

于 2009-03-24T20:49:50.157 に答える