Dominando Java Generics: Construyendo Código Reutilizable y Type-Safe
Java Generics – Construyendo Código Reutilizable y Type-Safe
Esta guía explica Java generics, cómo crear clases y métodos genéricos, y los beneficios que aportan, ilustrados con ejemplos claros.
Los generics de Java te permiten escribir una clase, interfaz o método que puede operar en muchos tipos de datos diferentes, manteniendo la seguridad en tiempo de compilación.
Nota: Generics no funcionan con tipos primitivos (int, float, char, etc).
Clase Genérica en Java
Al declarar un parámetro de tipo, puedes crear una clase que funcione con cualquier tipo de objeto.
Ejemplo: Crear una Clase Genérica
class Main {
public static void main(String[] args) {
ClaseGenerica<Integer> objInt = new ClaseGenerica<>(5);
System.out.println("Clase Genérica retorna: " + objInt.obtenerDato());
ClaseGenerica<String> objString = new ClaseGenerica<>("Programación Java");
System.out.println("Clase Genérica retorna: " + objString.obtenerDato());
}
}
class ClaseGenerica<T> {
private T dato;
public ClaseGenerica(T dato) {
this.dato = dato;
}
public T obtenerDato() {
return this.dato;
}
}
Salida
Clase Genérica retorna: 5 Clase Genérica retorna: Programación Java
En el ejemplo anterior, ClaseGenerica es una clase genérica donde T es el parámetro de tipo. Se crean dos instancias:
- objInt – T es reemplazado por
Integer, por lo que la clase trabaja con enteros. - objString – T es reemplazado por
String, por lo que la clase trabaja con cadenas.
Método Genérico en Java
Los métodos también pueden ser genéricos, permitiéndoles aceptar cualquier tipo de argumento manteniendo la seguridad de tipos.
Ejemplo: Crear un Método Genérico
class Main {
public static void main(String[] args) {
ClaseDemo demo = new ClaseDemo();
demo.<String>metodoGenerico("Programación Java");
demo.<Integer>metodoGenerico(25);
}
}
class ClaseDemo {
public <T> void metodoGenerico(T dato) {
System.out.println("Método Genérico:");
System.out.println("Dato Pasado: " + dato);
}
}
Salida
Método Genérico: Dato Pasado: Programación Java Método Genérico: Dato Pasado: 25
Cuando el compilador puede inferir el tipo, puedes omitir el argumento de tipo explícito:
demo.metodoGenerico("Programación Java");
Tipos Acotados (Bounded Types)
A veces quieres que un tipo genérico acepte solo una familia específica de clases. Los tipos acotados logran esto usando la palabra clave extends.
Sintaxis: <T extends A> – T puede ser A o cualquier subtipo de A.
Ejemplo: Tipos Acotados
class ClaseGenerica <T extends Number> {
public void mostrar() {
System.out.println("Esta es una clase genérica de tipo acotado.");
}
}
class Main {
public static void main(String[] args) {
// ClaseGenerica<String> obj = new ClaseGenerica<>(); // error en tiempo de compilación
}
}
Aquí, ClaseGenerica acepta solo tipos numéricos (Integer, Double, etc.). Intentar instanciarla con String causa un error en tiempo de compilación:
ClaseGenerica<String> obj = new ClaseGenerica<>(); ^ reason: inference variable T has incompatible bounds equality constraints: String lower bounds: Number where T is a type-variable: T extends Number declared in class ClaseGenerica
Ventajas de Java Generics
1. Reutilización de Código
El código genérico puede operar en múltiples tipos de datos, reduciendo duplicación. Por ejemplo, un solo método puede procesar enteros, cadenas y objetos personalizados.
2. Comprobación de Tipos en Tiempo de Compilación
Como el parámetro de tipo se conoce en tiempo de compilación, el compilador puede detectar incompatibilidades de tipos antes de que el programa se ejecute.
3. Integración Perfecta con Colecciones
El framework de colecciones de Java está basado en generics, permitiendo que las colecciones impongan type safety. Ejemplos:
ArrayList<String> lista1 = new ArrayList<>();
ArrayList<Integer> lista2 = new ArrayList<>();
Otras clases de colección (LinkedList, Queue, Map, etc.) también usan generics para los mismos beneficios.
Java
- Palabra clave final en Java: Variables, métodos y clases
- Operador instanceof en Java: Guía completa
- Dominando la herencia en Java: Conceptos, tipos y ejemplos prácticos
- Entendiendo las clases anidadas estáticas en Java: Uso, diferencias y ejemplos
- Dominando las clases internas anónimas en Java: Definición, sintaxis y ejemplos prácticos
- Patrón Singleton en Java explicado: Cómo implementarlo y usarlo de forma segura
- Dominando la Reflexión en Java: Inspeccionando clases, métodos y campos en tiempo de ejecución
- Dominando ArrayList en Java: Operaciones, métodos y mejores prácticas
- Clase Stack de Java: Guía Completa de Uso y Métodos
- Dominando ObjectOutputStream de Java: Serialización, Métodos y Ejemplos Prácticos
- Dominando las operaciones de archivos en Java con java.io: creación, lectura, escritura y eliminación