Clases genéricas
En Java, cuando defines una clase genérica puedes acotar el tipo permitido mediante herencia. Esto se consigue utilizando la palabra clave extends en el parámetro genérico. De esta forma, limitas el tipo genérico a una clase específica o a sus subclases.
Por ejemplo:
class ClaseGenerica<T extends ClaseBase> {
// Aquí, T solo puede ser ClaseBase o cualquier subclase de ClaseBase
}
T extends ClaseBase significa que el tipo genérico T debe ser de tipo ClaseBase o de una subclase de esta.
Supón que tienes una jerarquía de clases:
class Animal {
public void saludar() {
System.out.println("Soy un animal.");
}
}
class Perro extends Animal {
@Override
public void saludar() {
System.out.println("Soy un perro.");
}
}
class Gato extends Animal {
@Override
public void saludar() {
System.out.println("Soy un gato.");
}
}
Hemos definido tres clases:
Animal.Perro(hereda deAnimal).Gato(hereda deAnimal).
Ahora, defines una clase genérica acotada a Animal:
class Caja<T extends Animal> {
private T contenido;
public void agregar(T contenido) {
this.contenido = contenido;
}
public T obtener() {
return contenido;
}
public void mostrarSaludo() {
if (contenido != null) {
contenido.saludar(); // Método disponible porque T es como mínimo de tipo Animal
} else {
System.out.println("La caja está vacía.");
}
}
}
Hemos definido una clase Caja donde tiene un atributo contenido de tipo T. El tipo genérico T debe ser Animal o una subclase de Animal, en este caso, Perro o Gato. Así, podrías tener Caja<Perro>, Caja<Gato> y Caja<Animal>, pero no Caja<String>.
Y aquí tenemos el programa principal:
public class Main {
public static void main(String[] args) {
// Caja para perros
Caja<Perro> cajaPerro = new Caja<>();
cajaPerro.agregar(new Perro());
cajaPerro.mostrarSaludo(); // Salida: Soy un perro.
// Caja para gatos
Caja<Gato> cajaGato = new Caja<>();
cajaGato.agregar(new Gato());
cajaGato.mostrarSaludo(); // Salida: Soy un gato.
// Caja para animales en general
Caja<Animal> cajaAnimal = new Caja<>();
cajaAnimal.agregar(new Animal());
cajaAnimal.mostrarSaludo(); // Salida: Soy un animal.
}
}