Java Generics,创建Class <t> </t>的实例

时间:2011-02-18 19:46:35

标签: java class generics types

我正在尝试编写一个将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);时获得正确对象的实例?

2 个答案:

答案 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处理泛型的方式,你无法得到像你所要求的类。这就是为什么谷歌的东西专门要求这个类作为一个论点。您必须修改方法签名才能执行相同的操作。