I think due to type erasure , using instanceof
and class literals
are not allowed for parameterized generic types
except unbound
The point is that an object knows its concrete class - but not the generic type arguments for that. So if we construct an ArrayList<Integer>
, that knows at execution time that it's an ArrayList
of some kind - but it doesn't know about the Integer
part.
The "ArrayList
of some kind" part is precisely what ArrayList<?>
means, which is why:
if (foo instanceof ArrayList<?>)
is valid. It's just equivalent to using the raw type:
if (foo instanceof ArrayList)