Java Generics, Create an instance of Class

2019-06-17 17:11发布

I am trying to write a generic method for deserializing json into my model. My problem is that I don't know how to get Class from the generic type T. My code looks something like this (and doesn't compile this way)

public class JsonHelper {

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

        return gson.fromJson(json, Class<T>);
    }
}

I tried something else, to get the type, but it throws an error I had the class as JsonHelper<T> and then tried this

Class<T> persistentClass = (Class<T>) ((ParameterizedType)getClass()
    .getGenericSuperclass())
    .getActualTypeArguments()[0];

The method signature looks like this

com.google.gson.Gson.fromJson(String json, Class<T> classOfT)

So, how can I translate along T so that when I call JsonHelper.Deserialize<MyObject>(json); I get an instance of the correct object?

2条回答
在下西门庆
2楼-- · 2019-06-17 17:55

You need to get a Class instance from somewhere. That is, your Deserialize() method needs to take a Class<T> as a parameter, just like the underlying fromJson() method.

Your method signature should look like Gson's:

<T> T Deserialize(String json, Class<T> type) ...

Your calls will look like this:

MyObject obj = helper.Deserialize(json, MyObject.class);

By the way, the convention to start method names with a lowercase letter is well established in Java.

查看更多
Summer. ? 凉城
3楼-- · 2019-06-17 18:04

Unfortunately, the way Java handles generics, you cannot get the class like you're asking. That's why Google's stuff asks specifically for the class as an argument. You'll have to modify your method signature to do the same.

查看更多
登录 后发表回答