How can call public <T> T doit(Class<T> clazz); using MyClass<String>.class as clazz where I can not instantiate or extend MyClass.
EDIT: ‘David Winslow’ and ‘bmargulies’ responses are correct (MyClass<String>) doit(MyClass.class); works for the original question BUT surprisingly when the method returns say MyClass<T> instead of T casting will not compile any more.
Edit: I have replaced List with MyClass and added the condition to my original question.
Use
List.class. Because of type erasure type parameters to Java classes are entirely a compile-time construct – even ifList<String>.classwas valid syntax, it would be the exact same class asList<Date>.class, etc. Since reflection is by nature a runtime thing, it doesn’t deal well with type parameters (as implemented in Java).If you want to use the Class object to (for example) instantiate a new List instance, you can cast the result of that operation to have the appropriate type parameter.