I have a list like that:
private List<T> myList = new ArrayList<T>();
I want to get the .class of T. How can I do that?
I mean as like:
myList.getClass()
EDIT: I tried that:
Field genericField = Wrapper.class.getDeclaredField("myList");
ParameterizedType genericType = (ParameterizedType) genericField.getGenericType();
Class<?> genericClass = (Class<?>) genericType.getActualTypeArguments()[0];
and when I debug it
genericType
has a value of:
java.util.List
so I think that this is certainly different issue from that question: Get generic type of java.util.List because of if you declare a class with T
and assign something to T
later at another method, class that T
holds disappear.
You can't because of type erasure. The generic type is not known at runtime (it's 'erased'), it's only used at compile time.
This is a major difference between java generics and c# generics for example.
Why do you need to know this? Perhaps this will do what you need
// must be at least one element (and all elements are the same)
Class elementType = myList.get(0).getClass();
The only way to do this is to either
like
private final Class<T> type;
private final List<T> list = new ArrayList<T>();
public Class<T> getType() { return type; }
like
List list = new ArrayList<Integer>() { }; // create a specific sub-class
final Class<? extends List> listClass = list.getClass();
final ParameterizedType genericSuperclass = (ParameterizedType) listClass.getGenericSuperclass();
Class elementType = (Class) genericSuperclass.getActualTypeArguments()[0];
This has the dis-advantage that you could end up creating lots of anonymous classes and potential confusion with things like ArrayList.class != list.getClass()
however list instanceof ArrayList
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With