2017-09-03 75 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) 

我試圖宣佈一個新的註釋來表示類型,這是因爲一般的參數可以是一個或多個並且嵌套,如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參數進行解析和驗證。