Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using generic Type information in method

Tags:

java

generics

I have a method who's definition looks like this:

public static <T> List fromInputStreamToObject(InputStream inputStream, Class<T> clazz) throws Exception{
    List objects = null;
    try {
        if(inputStream!=null){
            Reader reader = new BufferedReader(new InputStreamReader(
                    inputStream));
            Type typeOfSrc = new TypeToken<JsonConverter<T>>(){}.getType();
            JsonConverter jsonConverter = getGson().fromJson(reader, typeOfSrc);
            if(jsonConverter!=null)
                objects = jsonConverter.getData();
        }
    } catch (Exception e) {
        throw e;
    }
    return objects;
}

This doesn't give any compilation error, but

Type typeOfSrc = new TypeToken<JsonConverter<T>>(){}.getType();

gives the run time exception "Type 'T' is not a Class, ParameterizedType, or GenericArrayType. Can't extract class."

How do i use the T to initialize my TypeToken instance?

like image 827
Varun Achar Avatar asked Feb 27 '26 23:02

Varun Achar


1 Answers

try this

Type typeOfSrc = type(JsonConverter.class, clazz);

// type(C, A1,...,An) => C<A1,...,An>
static ParameterizedType type(final Class raw, final Type... args)
{
    return new ParameterizedType()
    {
        public Type getRawType(){ return raw; }

        public Type[] getActualTypeArguments(){ return args; }

        public Type getOwnerType(){ return null; }
    };
} 
like image 190
irreputable Avatar answered Mar 01 '26 12:03

irreputable