Lecciones del módulo (2/2)
Tipos Genéricos en Java
Los Generics (Tipos Genéricos) se introdujeron en Java para permitir que las clases, interfaces y métodos operen sobre diferentes tipos como parámetros, garantizando el control de tipos en tiempo de compilación (Compile-time Type Safety) y evitando costosas conversiones (casts) explícitas en tiempo de ejecución.
Clases Genéricas
Una clase genérica se define utilizando paréntesis angulares <T> donde T representa un marcador de posición para un tipo que se especificará en el momento de la instanciación.
public class Box<T> {
private T content;
public void setContent(T content) {
this.content = content;
}
public T getContent() {
return content;
}
}
Al crear un objeto de tipo Box, especificamos el tipo real:
Box<Integer> integerBox = new Box<>();
integerBox.setContent(123);
int value = integerBox.getContent(); // Nessun cast necessario!
Métodos Genéricos
Es posible definir un único método genérico capaz de aceptar diferentes parámetros de tipo. El parámetro de tipo se coloca antes del tipo de retorno del método.
public static <E> void printArray(E[] elements) {
for (E element : elements) {
System.out.println(element);
}
}
Limitaciones de los Generics (Wildcards)
Podemos limitar los tipos aceptados por un genérico mediante la palabra clave extends (límite superior) para aceptar un tipo específico o sus subclases.
public static <T extends Number> void processNumber(T number) {
// Accetta Integer, Double, Float, ecc.
System.out.println(number.doubleValue());
}
Pruébalo tú
Completa la clase genérica Box definiendo el getter getValue() que devuelva T y el setter setValue(T value) que asigne la variable privada value.
Mostrar pista
Escribe los métodos con la firma correcta utilizando el parámetro de tipo genérico `T`.
Solución disponible después de 3 intentos
Crea un método genérico estático printArray que tome como entrada un arreglo de tipo T[] llamado array e imprima cada elemento usando un bucle for-each.
Mostrar pista
El parámetro de tipo `<T>` debe colocarse inmediatamente después de `static` y antes del tipo de retorno `void`.
Solución disponible después de 3 intentos
Crea una clase estática StringContainer que implemente la interfaz Container parametrizada con String. Define un constructor que acepte un parámetro String e implemente el método getItem().
Mostrar pista
Reemplaza el tipo genérico `T` con `String` en la firma de la clase y en el tipo de retorno del método `getItem()`.
Solución disponible después de 3 intentos