Genéricos (Generics)
- Caracterísitica de Java que aparece desde la versión 1.5.
- Proveen mayor legibilidad al código.
- Disminuyen la cantidad de bugs.
- Proveen mayor estabilidad.
- Se utiliza bastante con Java Collections Framework.
Clase Simple Caja y Casting
public class Caja {
private Object object;
public void poner(Object object){
this.object=object;
}
public Object obtener(){
return object;
}
}
Se pone un objeto Integer en la caja:
Caja cajaDeEnteros= new Caja(); cajaDeEnteros.poner(new Integer(8)); Integer entero = (Integer) cajaDeEnteros.obtener(); System.out.println(entero);
Ahora si se pone un String no detecta el error en tiempo de compilación:
cajaDeEnteros.poner("Hola");
Integer entero = (Integer) cajaDeEnteros.obtener();
System.out.println(entero);
y en tiempo de ejecución se muestra un ClassCastException.
Alternativa con Genéricos
public class Caja<T> {
private T t; // T se entiende como el tipo.
public void poner(T t) {
this.t = t;
}
public T obtener() {
return t;
}
}
Y se lo usaría de la siguiente forma:
Caja < Integer > cajaDeEnteros = new Caja < Integer >();
Ahora para obtener el objeto no se necesita hacer casting y ahora se detecta el error en tiempo de ejecución.
cajaDeEnteros.poner(new Integer(5)); Integer entero = cajaDeEnteros.obtener(); //no se hace casting System.out.println(entero);
Convención 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 más tipos.
Ejemplo:
public < U > void probarOtro(U u){
System.out.println("T: " + t.getClass().getName());
System.out.println("U: " + u.getClass().getName());
}