I understand generics when it comes to collections. But what does it mean in the case of the Class<T> class? When you instantiate a Class object, there’s only one object. So why the T parameter? What is it specifying? And why is it necessary (if it is)?
I understand generics when it comes to collections. But what does it mean in
Share
Type parameter
<T>has been added tojava.lang.Classto enable one specific idiom1 – use ofClassobjects as type-safe object factories. Essentially, the addition of<T>lets you instantiate classes in a type-safe manner, like this:Type parameter
<T>represents the class itself, enabling you to avoid unpleasant effects of type erasure by storingClass<T>in a generic class or passing it in as a parameter to a generic method. Note thatTby itself would not be sufficient to complete this task2: the type ofTis erased, so it becomesjava.lang.Objectunder the hood.Here is a classic example where
<T>parameter of the class becomes important. In the example below, Java compiler is able to ensure type safety, letting you produce a typed collection from a SQL string and an instance ofClass<T>. Note that the class is used as a factory, and that its type safety can be verified at compile time:Since Java erases the type parameter, making it a
java.lang.Objector a class specified as the generic’s upper bound, it is important to have access to theClass<T>object inside theselectmethod. SincenewInstancereturns an object of type<T>, the compiler can perform type checking, eliminating a cast.1
SUNOracle has published a good article explaining all this.2 This is different from implementations of generics without type erasure, such as one in .NET.
3 Java Generics tutorial by Oracle.