2016-08-30 9 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; 

} 
0を

そして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 of 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は常にオブジェクトに消去されると言っていますか?もしそうなら、私にはジェネリックメソッドが失われています。オブジェクトを使用して、必要なものだけをキャストできます。 –

関連する問題