Sobes.tech
Middle

¿Qué son los Genéricos y para qué se utilizan?

sobes.tech AI

Respuesta de la IA

Los genéricos en Java permiten crear clases, interfaces y métodos que trabajan con tipos parametrizados.

El propósito principal de los genéricos:

  • Mejorar la seguridad de tipos: El compilador verifica los tipos en tiempo de compilación, previniendo ClassCastException en tiempo de ejecución.
  • Eliminar la necesidad de hacer conversiones de tipos: No es necesario convertir manualmente los tipos al extraer elementos de colecciones.
  • Crear código más flexible y reutilizable: Se pueden escribir algoritmos y estructuras de datos genéricos aplicables a diferentes tipos de datos.

Ejemplo sin genéricos:

// Antes de Java 5
import java.util.ArrayList;
import java.util.List;

public class OldStyleList {
    public static void main(String[] args) {
        List list = new ArrayList(); // sin tipificación
        list.add("hola");
        list.add(123); // se puede agregar cualquier objeto

        String s = (String) list.get(0); // se requiere conversión de tipo
        Integer i = (Integer) list.get(1); // se requiere conversión de tipo

        // Puede ocurrir error de conversión de tipo
        // String error = (String) list.get(1); // ClassCastException
        System.out.println(s);
        System.out.println(i);
    }
}

Ejemplo con genéricos:

// Usando genéricos
import java.util.ArrayList;
import java.util.List;

public class GenericList {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>(); // lista de cadenas
        list.add("hola");
        // list.add(123); // error de compilación - no se puede agregar Integer

        String s = list.get(0); // sin necesidad de conversión de tipo

        // No es posible agregar otro tipo, previene errores
        // List<Integer> intList = new ArrayList<>();
        // intList.add("mundo"); // error de compilación
        System.out.println(s);
    }
}

Los genéricos también se usan en:

  • Clases: ArrayList<E>, HashMap<K, V>
  • Interfaces: List<E>, Map<K, V>
  • Métodos: <T> void printArray(T[] array)
  • Restricciones de tipos: <T extends Comparable<T>> (restricción a tipos que implementan Comparable)

La implementación de genéricos en Java se basa en "eliminación de tipos" (type erasure) en tiempo de compilación. Esto significa que la información sobre los tipos genéricos se elimina, y en tiempo de ejecución la JVM opera con tipos sin especificar. Esto garantiza compatibilidad con versiones anteriores de Java, pero tiene algunas limitaciones.