Mejor con un ejemplo:
class ClaseGenerica<T> {
T obj;
public ClaseGenerica(T o) {
obj = o;
}
public void classType() {
System.out.println("El tipo de T es " + obj.getClass().getName());
}
}
public class MainClass {
public static void main(String args[]) {
// Creamos una instancia de ClaseGenerica para Integer.
ClaseGenerica<Integer> intObj = new ClaseGenerica<Integer>(88);
intObj.classType();
// Creamos una instancia de ClaseGenerica para String.
ClaseGenerica<String> strObj = new ClaseGenerica<String>("Test");
strObj.classType();
}
}
Unos apuntes:
- T es el tipo genérico que será reemplazado por un tipo real.
- T es el nombre que damos al parámetro genérico.
- Este nombre se sustituirá por el tipo real que se le pasará a la clase.
El resultado será el siguiente:
El tipo de T es java.lang.Integer
El tipo de T es java.lang.String
Hay que tener en cuenta que los generics de java solo funcionan con objetos. El código siguiente nos mostrará un error:
ClaseGenerica<int> myOb = new ClaseGenerica<int>(53); // Error, can't use primitive type
Existen una serie de convenciones para nombrar a los genéricos:
E – Element (usado bastante por Java Collections Framework)
K – Key (Llave, usado en mapas)
N – Number (para números)
T – Type (Representa un tipo, es decir, una clase)
V – Value (representa el valor, también se usa en mapas)
S,U,V etc. – usado para representar otros tipos.
El artículo original se puede encontrar en este post: http://jonsegador.com/2012/10/clases-y-tipos-genericos-en-java
NOTA: artículo publicado por jonseg