Get type name for generic parameter of generic class [duplicate]

You can’t do this in general because of type erasure – an instance of A<String> doesn’t know the type of T. If you need it, one way is to use a type literal:

public class A<T>
{
    private final Class<T> clazz;

    public A<T>(Class<T> clazz)
    {
        this.clazz = clazz;
    }

    // Use clazz in here
}

Then:

A<String> x = new A<String>(String.class);

It’s ugly, but that’s what type erasure does 🙁

An alternative is to use something like Guice’s TypeLiteral. This works because the type argument used to specify a superclass isn’t erased. So you can do:

A<String> a = new A<String>() {};

a now refers to a subclass of A<String>, so by getting a.getClass().getSuperClass() you can eventually get back to String. It’s pretty horrible though.

Leave a Comment