2016-08-30 32 views
2

我想爲數據反序列化製作一個通用方法。Java通用方法不能按預期方式工作

我的代碼:

public <T> ExportedData<T> getExportData(T classType, String exportUri) { 
    Response response = _client.get(exportUri); 
    // System.out.println(response.body.toString()); 
    ExportedData<T> exportedData = GsonSingleton.getGson().fromJson(response.body.toString(), new TypeToken<ExportedData<T>>() { 
     }.getType()); 
    return exportedData; 
} 

response.body

{"totalResults":2,"limit":50000,"offset":0,"count":2,"hasMore":false,"items":[{"DevicesIDs":"","EmailAddress":"[email protected]"},{"DevicesIDs":"","EmailAddress":"[email protected]"}]} 

我稱之爲泛型方法的方式:

ExportedData<AccengageOutboundContact> exportedData = generalBulkHelper.getExportData(new AccengageOutboundContact(), uriLimitAndOffset); 

AccengageOutboundContact

public class AccengageOutboundContact { 

    public String EmailAddress; 
    public String DevicesIDs; 

} 

而且ExportedData

public class ExportedData<T> { 
    public int totalResults; 
    public int limit; 
    public int offset; 
    public int count; 
    public boolean hasMore; 
    public List<T> items; 
} 

我希望得到AccengageOutboundContact對象的ArrayList。我得到的是ArrayList StringMap

任何想法我做錯了什麼?

回答

2

我已經看過這一堆,但似乎沒有一個很好的重複鏈接。


基本問題是,T被擦除Object,在你的泛型方法。因此創建的TypeToken不包含所需的信息。

這導致反序列化爲StringMap


你可以通過一個完整的TypeToken到你的方法解決這個問題:

public <T> ExportedData<T> getExportData(TypeToken<ExportedData<T>> tt, String exportUri) { 
    Response response = _client.get(exportUri); 
    // System.out.println(response.body.toString()); 
    ExportedData<T> exportedData = GsonSingleton.getGson().fromJson(response.body.toString(), 
     tt.getType()); 
    return exportedData; 
} 

然後調用,如:

generalBulkHelper.getExportData(new TypeToken<ExportedData<AccengageOutboundContact>>(){}, 
    uriLimitAndOffset); 
+0

謝謝你,會嘗試,但爲什麼爲T擦除目的? –

+1

因爲[這是Java的泛型工作原理](http://stackoverflow.com/questions/339699/java-generics-type-erasure-when-and-what-happens)。 – Kayaman

+0

那麼你是說T總是被擦除爲一個對象?如果是這樣,對我來說,泛型方法是失敗的,我們總是可以使用對象,並將其轉換爲我們想要的東西,對吧? –

相關問題