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.
MyClass. class is a literal value of type Class (the same way as "..." is a literal value of type String ). It's available for all classes and interfaces, and also for primitive types ( int. class ).
getClass() in Java is a method of the Object class present in java. lang package. getClass() returns the runtime class of the object "this". This returned class object is locked by static synchronized method of the represented class.
Use List.class
. Because of type erasure type parameters to Java classes are entirely a compile-time construct - even if List<String>.class
was valid syntax, it would be the exact same class as List<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.
List<String> list = (List<String>)(ArrayList.class.newInstance());
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