2 回答

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊
如果您的目標(biāo)是斷言僅接受帶注釋的類,那么您幾乎沒(méi)有解決方法選項(xiàng):
編寫一個(gè)在編譯時(shí)執(zhí)行斷言的注釋處理器(參見(jiàn)@NonNull等如何工作)。這是一項(xiàng)有趣的工作,但并不簡(jiǎn)單,因?yàn)榫幾g/類型系統(tǒng)對(duì)于許多經(jīng)驗(yàn)豐富的 Java 開發(fā)人員來(lái)說(shuō)是全新的。
使用某種形式的 AOP(AspectJ、Spring AOP 等)來(lái)“建議”帶有裝飾器的所有帶注釋的方法,該裝飾器的職責(zé)是斷言參數(shù)具有相同的注釋。
使用在運(yùn)行時(shí)顯式檢查
parameter.getClass().isAnnotationPresent(MyAnnotation.class)

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超10個(gè)贊
像Checker Framework這樣的工具會(huì)插入編譯器中,以類似于您所請(qǐng)求的方式限制通用實(shí)例化。它作為注釋處理器實(shí)現(xiàn),并提供正確使用的編譯時(shí)保證。
例如,您可以寫class MyList<T extends @NonNull Object> {...}
。
Checker Framework 使您能夠構(gòu)建自己的檢查器,它強(qiáng)制執(zhí)行您喜歡的任何規(guī)則@KeySerializable
。在您的情況下,規(guī)則可能非常簡(jiǎn)單,您只需定義幾個(gè)類型限定符并使用子類型檢查器- 至少一開始是這樣。
請(qǐng)注意,要使 Checker 框架使用注釋工作@KeySerializable
,該注釋必須是類型注釋而不是聲明注釋。
添加回答
舉報(bào)