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

39,026

Solution 1

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").

Solution 2

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

Class<List<MyClass>> clazz = 
   (Class<List<MyClass>>) new ArrayList<MyClass>().getClass();

Solution 3

As a follow up to this, I found this in the Gson docs.

Type listType = new TypeToken<List<String>>() {}.getType();

Which solves the problem of getting the type safely but the TypeToken class is specific to Gson.

Solution 4

If you are using SpringFramework you could use ParameterizedTypeReference as follows:

 restClient.getDeserializedJSON(ParameterizedTypeReference<List<MyClass>>(){},url);
Share:
39,026
Rob Stevenson-Leggett
Author by

Rob Stevenson-Leggett

I love to code and snowboard. Follow me on twitter: @rsleggett

Updated on July 09, 2022

Comments

  • Rob Stevenson-Leggett
    Rob Stevenson-Leggett almost 2 years

    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?

  • Line
    Line over 6 years
    "The only problem with this solution is that you have to suppress the unchecked warning" - I'm not sure about that. You can as well have this warning, right?
  • Khalid ElSayed
    Khalid ElSayed over 6 years
    Ok, but this actually didn't solve the generic problem! I look for something like Type listType = new TypeToken<List<T>>() {}.getType(); and the generic type T is passed as a method paramter like you did in your question