Java泛型方法无法按预期工作

时间:2016-08-30 14:01:00

标签: java generics

我正在尝试为数据反序列化创建一个通用方法。

我的代码:

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":"zatokar@gmail.com"},{"DevicesIDs":"","EmailAddress":"oto@increase.dk"}]}

我称之为通用方法的方式:

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。我得到的是StringMap的ArrayList。

知道我做错了什么吗?

1 个答案:

答案 0 :(得分: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);