Genéricos

Contactar con el profesor

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

Caso concreto

Si para usar genéricos en una clase usamos una palabra reservada, los objetos declarados con esa palabra reservada no serán lo que corresponda, sino que serán de tipo Object

class Generics<String> {
	String valor=(String) "elefante";
}
← Contenedores
Ejercicio alta, baja, modificación y consulta en un ArrayList →

Aviso Legal | Política de privacidad