2016-08-30 4 views
2

Я пытаюсь создать общий метод десериализации данных.Java generic method не работает должным образом

Мой код:

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; 
} 

Я хотел бы ожидать, чтобы получить ArrayList из AccengageOutboundContact объектов. Я получаю 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 всегда стирается до объекта? Если это так, для меня общие методы теряют точку, мы всегда можем просто использовать объекты и просто бросать их на то, что хотим, не так ли? –

Смежные вопросы