It’s the same as with all generic and raw types:
Class // An unknown class (raw type)
Class<?> // An unknown class (generic version)
Class<String> // The String class
In this special case there’s not much practical difference between Class
and Class<?>
because they both denote an unknown class. Depending on the existing declarations the compiler can demand a generic type instead of a raw type.
But: Since Java 1.5 you should use the generic form wherever possible. Class<?>
clearly states that you mean “an unknown class”, Class<String>
cleary states that you mean the String
class. A raw Class
could mean both.
In the end it makes not much of a difference to the compiler but it makes a huge difference in making the intentions of your code more understandable and maintainable.