Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Passing the Class<T> in java of a generic list?

I have a method for reading JSON from a service, I'm using Gson to do my serialization and have written the following method using type parameters.

public T getDeserializedJSON(Class<T> aClass,String url)
{
    Reader r = getJSONDataAsReader(url);
    Gson gson = new Gson();
    return gson.fromJson(r, aClass);
}

I'm consuming json which returns just an array of a type e.g.

[
 { "prop":"value" }
 { "prop":"value" }
]

I have a java class which maps to this object let's call it MyClass. However to use my method I need to do this:

RestClient<ArrayList<MyClass>> restClient = new RestClient<ArrayList<MyClass>>();
ArrayList<MyClass> results = restClient.getDeserializedJSON(ArrayList<MyClass>.class, url);

However, I can't figure out the syntax to do it. Passing just ArrayList.class doesn't work.

So is there a way I can get rid of the Class parameter or how do I get the class of the ArrayList of MyClass?

like image 684
Rob Stevenson-Leggett Avatar asked May 09 '10 14:05

Rob Stevenson-Leggett


2 Answers

You can use Bozho's solution, or avoid the creation of a temporary array list by using:

Class<List<MyClass>> clazz = (Class) List.class;

The only problem with this solution is that you have to suppress the unchecked warning with @SuppressWarnings("unchecked").

like image 175
Eyal Schneider Avatar answered Oct 29 '22 05:10

Eyal Schneider


You can't. You'd have to use unsafe cast:

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();
like image 41
Bozho Avatar answered Oct 29 '22 05:10

Bozho