I did not get this code to compile either way:
List<List> a = new ArrayList();
List<List<?>> b = new ArrayList();
a = b; // incompatible types
b = a; // incompatible types
It seems that java does not consider List
and List<?>
to be the same type when it comes to generics.
Why is that? And is there some nice way out?
Context
There is a library function with following signature: public <T> Set<Class<? extends T>> getSubTypesOf(final Class<T> type)
. This works fine for simple types passed as argument but in case of generics the result is not parametrized with wildcard causing javac to complain about raw type. I would like to propagate the result to the rest of my application as Set<Class<? extends GenericTypeHere<?>>>
but simple cast does not work as I expect.
EDIT: Solution
Thanks for the answers, here is how I get it working in the end:
@SuppressWarnings({"rawtypes", "unchecked"})
private static Set<Class<? extends GenericTypeHere<?>>> factoryTypes() {
return (Set) new Reflections("...").getSubTypesOf(GenericTypeHere.class);
}
List<List>
andList<List<?>>
. I don't think we know enough about the context here to say if a cast is appropriate but I showed how to do it in the Q&A I linked to. – Amyloid