Los tipos genéricos se utilizan ampliamente en las colecciones de Java. ¿Por qué necesitamos tipos genéricos en Java? Comprender esta pregunta puede ayudarnos a comprender mejor muchos conceptos relacionados. En este artículo, usaré un ejemplo muy breve para ilustrar por qué Generic es útil.
1. Descripción general de los genéricos
El objetivo de implementar Generics es encontrar errores en tiempo de compilación, además de en tiempo de ejecución. Encontrar errores en tiempo de compilación puede ahorrar tiempo para depurar el programa Java, porque los errores en tiempo de compilación son mucho más fáciles de encontrar y corregir. Los tipos genéricos solo existen en tiempo de compilación. Este hecho es lo más importante que debe recordar para aprender Java Generics.
2. ¿Qué pasa si no hay genéricos?
En el siguiente programa, la clase «Room» define un objeto miembro. Podemos pasarle cualquier objeto, como String, Integer, etc.
class Room { private Object object; public void add(Object object) { this.object = object; } public Object get() { return object; } } public class Main { public static void main(String[] args) { Room room = new Room(); room.add(60); //room.add("60"); //this will cause a run-time error Integer i = (Integer)room.get(); System.out.println(i); } } |
El programa funciona perfectamente cuando agregamos un número entero y lo lanzamos. Pero si un usuario agrega accidentalmente una cadena «60», el compilador no sabe que es un problema. Cuando se ejecuta el programa, obtendrá una ClassCastException.
Exception in thread "main" java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at collection.Main.main(Main.java:21)
Quizás se pregunte por qué no declarar simplemente que el tipo de campo es Integer en lugar de Object. Si es así, la habitación no es tan útil porque solo puede almacenar un tipo de cosas.
3. Cuándo se usan genéricos
Si se utiliza un tipo genérico, el programa se convierte en el siguiente.
class Room<T> { private T t; public void add(T t) { this.t = t; } public T get() { return t; } } public class Main { public static void main(String[] args) { Room<Integer> room = new Room<Integer>(); room.add(60); Integer i = room.get(); System.out.println(i); } } |
Ahora, si alguien agrega room.add («60»), se mostrará un error en tiempo de compilación como el siguiente:
Podemos ver fácilmente cómo funciona esto. Además, ya no es necesario emitir el resultado desde room.get () ya que la compilación sabe que get () devolverá un entero.
4. Resumen
En resumen, las razones para utilizar Genéricos son las siguientes:
- Comprobación de tipos más estricta en tiempo de compilación.
- Eliminación de elenco explícito.
- Permitir una mejor reutilización del código, como la implementación de algoritmos genéricos
El tipo genérico de Java es solo un concepto en tiempo de compilación. Durante el tiempo de ejecución, todos los tipos de información se borran, y esto se denomina Borrado de tipos. Aquí hay un ejemplo interesante para mostrar cómo evitar los errores comunes de Type Erasure.
Referencias:
1. ¿Por qué utilizar genéricos?