Fueron introducidos en Java 5.0.
Los tipos genéricos se encuentran incluidos dentro de los caracteres <>. Especifican el tipo de datos que va a almacenar, utilizar o devolver una clase o método.
Genéricos en colecciones
ArrayList <String>arrayList = new ArrayList<String>();
arrayList.add("vaca");
arrayList.add("perro");
arrayList.add("elefante");
Iterator<String> it = arrayList.iterator();
while(it.hasNext()){
String cadena =it.next();
System.out.println(cadena);
}
Notas
- No es necesaria la comprobación de tipos en tiempo de ejecución con lo cual reduce el uso de casting en el código.
- El código será menos ambiguo y más fácil de mantener.
Genéricos en clases
public class Generics1 {
public static void main(String[] args) {
Calculadora calculadora = new Calculadora();
calculadora.sumar(4, 5);
}
}
// El tipo de dato generico E (valdria cualquier nombre de clase inexistente)
// podra ser sustituido dentro de la clase por una clase de
// cualquier tipo, que sera definido al declarar e instanciar la clase
class Calculadora {
public double sumar(T n1, T n2) {
if (n1 instanceof Number && n2 instanceof Number) {
return (Double.parseDouble(n1.toString()) + Double.parseDouble(n2.toString()));
}
return 0;
}
// Un metodo estatico no puede acceder a un tipo de dato generico
// Cuando declaro un objeto de la clase calculadora defino el tipo de dato
// que va a sustituir al generico. Sin embargo un
// metodo estatico es cargado en memoria antes de declarar la clase que lo
// contiene y por tanto no sabemos que tipo de dato va a
// sustituir al generico, ya que este tipo de dato es definido al hacer la
// declaracion
//public static void sumar2(E e, E e2) {}
}
Un método estático no puede acceder a un tipo de dato genérico. Cuando declaro un objeto de la clase calculadora defino el tipo de dato que va a sustituir al genérico. Sin embargo un método estático es cargado en memoria antes de declarar la clase que lo contiene y por tanto no sabemos que tipo de dato va a sustituir al genérico, ya que este tipo de dato es definido al hacer la declaración
El tipo de dato genérico E (valdría cualquier nombre de clase inexistente) podrá ser sustituido dentro de la clase por una clase de cualquier tipo, que será definido al declarar e instanciar la clase