Typically, I’ve seen people use the class literal like this:
Class<Foo> cls = Foo.class;
But what if the type is generic, e.g. List? This works fine, but has a warning since List should be parameterized:
Class<List> cls = List.class
So why not add a <?>? Well, this causes a type mismatch error:
Class<List<?>> cls = List.class
I figured something like this would work, but this is just a plain ol’ syntax error:
Class<List<Foo>> cls = List<Foo>.class
How can I get a Class<List<Foo>> statically, e.g. using the class literal?
I could use @SuppressWarnings("unchecked") to get rid of the warnings caused by the non-parameterized use of List in the first example, Class<List> cls = List.class, but I’d rather not.
Any suggestions?
You can’t due to type erasure.
Java generics are little more than syntactic sugar for Object casts. To demonstrate:
The only instance where generic type information is retained at runtime is with
Field.getGenericType()if interrogating a class’s members via reflection.All of this is why
Object.getClass()has this signature:The important part being
Class<?>.To put it another way, from the Java Generics FAQ: