2017-09-03 19 views
0

注釈を使用してパラメータ化された型を表すにはどうすればよいですか?私はそのようないくつかのメソッドを生成する注釈プロセッサを使用しようと

void result(Consumer<Type> name){ 

} 

私は、パラメータを表現するために、アノテーションを使用して必要以上に。のみサポートコンパイル時定数

@Retention(RetentionPolicy.SOURCE) 
public @interface Parameter { 

    String name(); 

    Class<?> type(); 
} 

しかし注釈メンバー、それは以下の不正Javaコードは、注釈によって表現することができない、例えば、パラメータ化された型に直接送達することは不可能であるので。

@Parameter(name ="ids",type = ArrayList<Integer>.class) 

私は、一般的なパラメータが1つまたは複数と入れ子にすることができますので、そのようなArrayList <HashMap <String, String >>など、種類を表す新しい注釈を宣言しようとしましたが、Javaは注釈が自身を参照サポートしていません、それは巡回注釈が発生します要素タイプがエラーです。次のアノテーションも違法です。

public @interface Type{ 
    Class<?> type(); 
    Type[] parameters() default {}; 
} 

@Retention(RetentionPolicy.SOURCE) 
public @interface Parameter { 

    String name(); 

    Type type(); 
} 

すべてのソリューションはありますか?

+0

この注釈でモデル化しようとしていることは何ですか? –

+0

@SotiriosDelimanolis私は、アノテーションプロセッサを使ってそのようないくつかのメソッドを生成しようとしています: 'void result(Consumer name)' – DouO

+1

そうです、そのユースケースについて詳しく説明してください。なぜそれが正確にこのように必要なのかはすぐには分かりません。 [XY問題とは何ですか?](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem) –

答えて

0

注釈引数として値を表現できない場合は、代わりに文字列を使用するのが標準的な解決方法です。たとえば、@Parameter(..., type = ArrayList<Integer>.class)の代わりに、@Parameter(..., type = "ArrayList<Integer>")を使用します。これは、任意にネストされたパラメータ化された型を表すことができます。

注釈を使用するコードでは、String引数の解析と検証が必要です。

関連する問題