Java Generics,创建Class <T>的实例

Jos*_*osh 7 java generics types class

我正在尝试编写一个通用的方法来将json反序列化到我的模型中.我的问题是我不知道如何从泛型类型T获取类.我的代码看起来像这样(并且不以这种方式编译)

public class JsonHelper {

    public <T> T Deserialize(String json)
    {
        Gson gson = new Gson();

        return gson.fromJson(json, Class<T>);
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试了其他的东西,以获得类型,但它抛出了我的课程JsonHelper<T>,然后尝试了这个错误

Class<T> persistentClass = (Class<T>) ((ParameterizedType)getClass()
    .getGenericSuperclass())
    .getActualTypeArguments()[0];
Run Code Online (Sandbox Code Playgroud)

方法签名如下所示

com.google.gson.Gson.fromJson(String json, Class<T> classOfT)
Run Code Online (Sandbox Code Playgroud)

那么,我怎样才能沿着T转换,以便在我调用时JsonHelper.Deserialize<MyObject>(json);获得正确对象的实例?

eri*_*son 13

你需要Class从某个地方获得一个实例.也就是说,您的Deserialize()方法需要将a Class<T>作为参数,就像底层fromJson()方法一样.

您的方法签名应该看起来像Gson的:

<T> T Deserialize(String json, Class<T> type) ...
Run Code Online (Sandbox Code Playgroud)

您的电话将如下所示:

MyObject obj = helper.Deserialize(json, MyObject.class);
Run Code Online (Sandbox Code Playgroud)

顺便说一句,在Java中很好地建立了用小写字母开始方法名称的约定.

  • @Josh:当然,如果来自另一种语言的人开始使用他们习惯的风格,这是可以理解的.也就是说,最好学习并尝试将代码风格与您正在使用的语言的标准保持一致. (5认同)

Str*_*ior 6

不幸的是,Java处理泛型的方式,你不能像你所要求的那样获得类.这就是为什么谷歌的东西专门要求这个类作为一个论点.您必须修改方法签名才能执行相同操作.