第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

Java 泛型類型綁定到具有特定注釋的類

Java 泛型類型綁定到具有特定注釋的類

ABOUTYOU 2024-01-25 21:39:24
在java中,可以將通用參數(shù)綁定到實(shí)現(xiàn)特定接口的類,因此以下是可能的interface MyInterface {}class MyClassA implements MyInterface {}class MyBoundedClassA<T extends MyInterface>現(xiàn)在,如果我想將參數(shù)綁定到用特定注釋注釋的類,例如:interface @MyAnnotation {}@MyAnnotationclass MyClassB {}class MyBoundedClassB<T extends MyAnnotation> // NOT possible在Java中是否可以實(shí)現(xiàn)這樣的行為?- - 編輯根據(jù)要求添加現(xiàn)實(shí)世界的例子。稍微修改域以使示例更容易理解。有一個(gè)眾所周知的杰克遜庫(kù)用于序列化對(duì)象。該庫(kù)不支持字符串以外的映射鍵的序列化,因此以下內(nèi)容不可能開箱即用class TimeRange {  LocalDateTime startDate;  LocalDateTime endDate;}class SportsmenActivities {  private Map<String, <TimeRange, List<Activity>>  sportActivities;}在此示例中,外部地圖的鍵是“sportsmanCode”,如“andy”、“mike”、“john”。內(nèi)部地圖包含給定運(yùn)動(dòng)員在給定時(shí)間段內(nèi)執(zhí)行的活動(dòng)。假設(shè)安迪慢跑了一天,條目如下:new SportsmanActivities().get("andy").put(TimeRange.of('2012-12-01,'2012-12-02'), List.with(new JoggingActivity)) // did some pseudo code here for readablity現(xiàn)在正如所說(shuō)的杰克遜不會(huì)將其序列化開箱即用,所以我編寫了通用模塊,它允許序列化此類復(fù)雜的地圖。要使用它,您需要做的就是像這樣注釋您的“關(guān)鍵”類:@KeySerializableclass TimeRange {  @MyMapKey  LocalDateTime startDate;  @MyMapKey  LocalDateTime endDate;}您可以猜測(cè)用@MyMapKey注釋的字段將用于生成MapKey?,F(xiàn)在我有一個(gè) jackson 類的實(shí)現(xiàn),它動(dòng)態(tài)地序列化作為用 @KeySerialized 注釋的“文本映射鍵”傳遞的所有內(nèi)容。簽名如下    class MyMapKeySerializer<T> extends JsonSerializer<T> {      serialize (T keyToSerialize) {       // do magic       }   }這是可行的,但我想限制 T 只接受用 @KeySerialized 注釋的類,因?yàn)橹挥袑?duì)于此類類,此方法才有意義。理想情況下,這將是這樣的:   class MyMapKeySerializer<T annotatedWith @KeySerializable> extends JsonSerializer<T> {      serialize (T keyToSerialize) {       // do magic       }   } 
查看完整描述

2 回答

?
嗶嗶one

TA貢獻(xiàn)1854條經(jīng)驗(yàn) 獲得超8個(gè)贊

如果您的目標(biāo)是斷言僅接受帶注釋的類,那么您幾乎沒(méi)有解決方法選項(xiàng):

  1. 編寫一個(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ō)是全新的。

  2. 使用某種形式的 AOP(AspectJ、Spring AOP 等)來(lái)“建議”帶有裝飾器的所有帶注釋的方法,該裝飾器的職責(zé)是斷言參數(shù)具有相同的注釋。

  3. 使用在運(yùn)行時(shí)顯式檢查parameter.getClass().isAnnotationPresent(MyAnnotation.class)


查看完整回答
反對(duì) 回復(fù) 2024-01-25
?
守候你守候我

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,該注釋必須是類型注釋而不是聲明注釋。


查看完整回答
反對(duì) 回復(fù) 2024-01-25
  • 2 回答
  • 0 關(guān)注
  • 189 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)