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()); }