Saltar al contenido principal

Clases genéricas

Las clases genéricas (generic classes) en Java se utilizan para añadir flexibilidad y seguridad de tipos a las clases. Esto permite definir clases que pueden trabajar con diferentes tipos de datos sin comprometer la seguridad en tiempo de compilación.

Una clase genérica incluye uno o más parámetros de tipo, que se indican dentro de < > en la definición de la clase.

class ClaseTipada<T> {
private T elemento;

public ClaseTipada(T elemento) {
this.elemento = elemento;
}

public T getElemento() {
return elemento;
}

public void setElemento(T elemento) {
this.elemento = elemento;
}
}

T es un parámetro de tipo, que actúa como un marcador de posición para un tipo concreto (por ejemplo, String, Integer, o cualquier clase incluida las creadas por nosotros). La clase puede almacenar, devolver y manipular objetos del tipo T sin especificar un tipo concreto en la definición.

Para utilizar una clase genérica:

ClaseTipada<String> cajaTexto = new ClaseTipada<>("Texto ejemplo");
System.out.println("Elemento: " + cajaTexto.getElemento());

ClaseTipada<Integer> cajaNumero = new ClaseTipada<>(123);
System.out.println("Elemento: " + cajaNumero.getElemento());

Las ventajas de usar este tipo de clases son:

  • Seguridad en tiempo de compilación: Los errores relacionados con tipos son detectados en tiempo de compilación, evitando problemas en tiempo de ejecución. Ejemplo: Si intentas añadir un String a una clase genérica para Integer, el compilador dará un error.
  • Reutilización del código: Puedes usar la misma clase para diferentes tipos de datos sin reescribirla.
  • Mejora de la legibilidad: El código es más claro y evita el uso de conversiones innecesarias.
  • Evita el uso excesivo de Object: Antes de generics, las clases que trabajaban con varios tipos usaban Object, requiriendo conversiones explícitas.

Parámetros de tipo múltiples

Las clases genéricas pueden tener múltiples parámetros de tipo, separados por comas.

class Par<K, V> {
private K clave;
private V valor;

public Par(K clave, V valor) {
this.clave = clave;
this.valor = valor;
}

public K getClave() {
return clave;
}

public V getValor() {
return valor;
}
}
Par<String, Integer> entrada = new Par<>("Edad", 30);
System.out.println("Clave: " + entrada.getClave());
System.out.println("Valor: " + entrada.getValor());

Métodos genéricos

Los métodos de una clase pueden ser genéricos independientemente de que la clase tenga generics.

class Utilidades {
public static <T> void imprimirArray(T[] array) {
for (T elemento : array) {
System.out.println(elemento);
}
}
}
String[] nombres = {"Ana", "Pedro", "Marta"};
Integer[] numeros = {1, 2, 3};

Utilidades.imprimirArray(nombres);
Utilidades.imprimirArray(numeros);