Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to do `MyClass<String>.class` in Java?

Tags:

java

generics

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.

like image 583
Ali Shakiba Avatar asked Mar 05 '11 22:03

Ali Shakiba


People also ask

What is MyClass in Java?

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 ).

What is getClass () in Java?

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.


1 Answers

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());
like image 101
David Winslow Avatar answered Oct 20 '22 00:10

David Winslow