How to create a class literal of a known type: Class<List<String>>
Solution 1:
You can always cast to what you need, like this
return (Class<List<String>>) new ArrayList<String>().getClass();
or
return (Class<List<String>>) Collections.<String>emptyList().getClass();
But I assume that's not what you are after. Well it works, with a warning, but it isn't exactly "beautiful".
I just found this
Why is there no class literal for wildcard parameterized types?
Because a wildcard parameterized type has no exact runtime type representation.
So casting might be the only way to go.
Solution 2:
You should never use the construct Class<List<String>>
. It is nonsensical, and should produce a warning in Java (but doesn't). Class instances always represent raw types, so you can have Class<List>
; that's it. If you want something to represent a reified generic type like List<String>
, you need a "super type token" like Guice uses:
http://google-guice.googlecode.com/git/javadoc/com/google/inject/TypeLiteral.html
Solution 3:
You can implement that method like this:
public Class<List<String>> getObjectType() {
return (Class<List<String>>) ((Class)List.class);
}
Solution 4:
The existence of a Class<List<String>>
is inherently dangerous. here's why:
// This statement generates a warning - for a reason...
Class<List<String>> unsafeListClass = (Class<List<String>>) (Class<?>) List.class;
List<Integer> integerList = new ArrayList<Integer>(); // Ok
integerList.add(42); // Ok
System.out.println(unsafeListClass.isInstance(integerList)); // Prints "true".
List<String> stringList =
unsafeListClass.cast(integerList); // Succeeds, with no warning!
stringList.add("Hello, World!"); // Also succeeds with no warning
for (int x: integerList) {
// Compiles without warning, but throws ClassCastException at runtime
System.out.println(100-x);
}