Is there a clean way to assign the Class of a generic type to a variable?

generics, java

Solution

This is a real Catch-22 in Java.

The compiler warns you if you don't add a generic type to `List`:

// WARN: List is not typed
Class<? extends List> typeTry3 = ints.getClass();

That's because, in most cases, it's really best to type your Lists.

However, because of type erasure, there's no way for Java to figure out the generic type of `List` at runtime, and the compiler knows that. Therefore, there is no method on `Class` that will returned a typed object:

// ERROR: ints.getClass() doesn't return a Class<List<Integer>>, it returns a Class<List>
Class<? extends List<? extends Integer>> var = ints.getClass();

So you must cast it to a typed list. However, as you know, since there is no runtime type checking, Java warns you about any casts to a typed variable:

// WARN: Casting to typed List
Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass();

Any attempt to get around this is essentially a means of confusing the compiler, and will inevitably be convoluted.

Your best bet then is to go with Option B:

On the other hand, if warning suppression is the only way, what is the safest to suppress?

The safest way to suppress this warning is to make your `@SuppressWarnings("unchecked")` annotation as localized as possible. Put them above each individual unchecked cast. That way it's absolutely clear who's causing the warning.

Problem

Given this code: ``` List<Integer> ints = new ArrayList<Integer>(); // Type mismatch: // cannot convert from Class<capture#1-of ? extends List> to Class<List<Integer>> Class<List<Integer>> typeTry1 = ints.getClass(); // Type safety: // Unchecked cast from Class<capture#2-of ? extends List> to Class<List<Integer>> Class<List<Integer>> typeTry2 = (Class<List<Integer>>) ints.getClass(); // List is a raw type. References to generic type List<E> should be parameterized Class<? extends List> typeTry3 = ints.getClass(); ``` Is there a way to get the `Class` of a `List<Integer>` without an error or warning? I can suppress the warnings easily enough, but if Java requires me to suppress a warning for this valid code, I am very disappoint. On the other hand, if warning suppression is the only way, what is the safest to suppress?

Original source

Related problems