2011-04-11 20 views
1

我有一個要求,我必須編寫一個自定義的XStream MapConverter,只是轉換特定類型的地圖。舉個例子,我想讓我的自定義轉換器只使用Map(String,Date)地圖。我需要通過覆蓋canConvert方法來實現此目的。截至目前,這是我寫的canConvert方法:XStream canConvert問題的參數化的仿製藥

@Override 
public boolean canConvert(Class clazz) { 
    return (!clazz.equals(Object.class) && Map.class.isAssignableFrom(clazz)); 
} 

但是,這將適用於所有類型的地圖。由於「java.lang.Class」沒有公開提供有關參數類型信息的任何方法,因此對於泛型集合,我無法在canConvert方法中實現所需的結果。

我能想到的一種解決方法是圍繞Map(String,Date)創建一個虛擬包裝類,並使用它實現canConvert方法。有人可以提出一個更好的方法來解決canConvert方法中的這個問題嗎?

回答

0

你不能在泛型上做很多工作,因爲它們在運行時不存在。您可以嘗試抓住第一個鍵和輸入值並檢查它們的類型。這顯然不適用於空地圖,但如果地圖爲空,則可能無需將其轉換。

Map<String, Date> m = new HashMap<String, Date>(); 
m.put("test", new Date()); 
Object key = m.keySet().iterator().next(); 
Object value = m.get(key); 

System.out.println(key.getClass().isAssignableFrom(String.class)); 
System.out.println(value.getClass().isAssignableFrom(Date.class)); 

除此之外,它就像你說的,你很可能使自己的包裝類或滾動地圖的自定義實現只接受字符串鍵和日期值。

+0

這被平凡地擴展以支持空映射,但是您可能遇到異構映射的問題(即代碼假定映射中的所有值都是相同類型的,這可能不是真的)。 – ykaganovich 2011-04-12 01:37:39

+0

我不認爲這裏提到的代碼會工作,因爲canConvert()方法中唯一可用的參數是類名稱。當這個方法被XStream框架調用時,不能訪問數據,只能訪問類的類型。 – invinc4u 2011-04-18 20:50:29