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)