我正在尝试编写一个将json反序列化到我的模型中的泛型方法。我的问题是我不知道如何从泛型类型T获取类。我的代码看起来像这样(并且不以这种方式编译)
public class JsonHelper {
public <T> T Deserialize(String json)
{
Gson gson = new Gson();
return gson.fromJson(json, Class<T>);
}
}
我尝试了其他的东西,以获取该类型,但是它引发了一个错误,我将该类作为JsonHelper<T>
,然后尝试了这个
Class<T> persistentClass = (Class<T>) ((ParameterizedType)getClass()
.getGenericSuperclass())
.getActualTypeArguments()[0];
方法签名如下所示
com.google.gson.Gson.fromJson(String json, Class<T> classOfT)
那么,如何在T中进行翻译,以便在我调用JsonHelper.Deserialize<MyObject>(json);
时获得正确对象的实例?
答案 0 :(得分:13)
您需要从某个地方获取Class
个实例。也就是说,您的Deserialize()
方法需要将Class<T>
作为参数,就像基础fromJson()
方法一样。
您的方法签名应该看起来像Gson:
<T> T Deserialize(String json, Class<T> type) ...
您的来电将如下所示:
MyObject obj = helper.Deserialize(json, MyObject.class);
顺便说一句,在Java中很好地建立了使用小写字母开始方法名称的约定。
答案 1 :(得分:6)
不幸的是,Java处理泛型的方式,你无法得到像你所要求的类。这就是为什么谷歌的东西专门要求这个类作为一个论点。您必须修改方法签名才能执行相同的操作。