Diccionario

Genéricos

Una forma de escribir funciones o clases que funcionan con cualquier tipo de dato, indicando el tipo concreto al usarlas.

Sin genéricos habría que escribir una lista de números, otra de textos, otra de clientes… Con ellos se escribe una vez Lista<T>, donde T es un hueco para el tipo, y se usa como Lista<Cliente>.

El compilador comprueba que en una Lista<Cliente> solo metes clientes. En C++ se llaman plantillas (templates).

Un ejemplo

List<String> en Java o Vec<i32> en Rust son listas genéricas a las que se les ha dicho qué tipo de elementos contienen.

Por qué importa

Los genéricos te permiten escribir una sola vez una clase o función que sirva para muchos tipos, sin perder las comprobaciones del compilador. Una lista de números y una lista de textos comparten la misma lógica, y con genéricos no tienes que duplicar el código ni recurrir a un tipo demasiado amplio.

Los usas desde el primer día en lenguajes tipados: List<String> en Java, Vec<i32> en Rust o Array<number> en TypeScript. Gracias a ellos, el compilador detecta si intentas meter un número en una lista de textos, en lugar de descubrirlo al ejecutar.

Confusiones frecuentes

Un genérico no es lo mismo que un tipo cualquiera como Object en Java o any en TypeScript. Con any renuncias a las comprobaciones, mientras que con un genérico el tipo concreto se conserva: si guardas un String en una lista genérica, al sacarlo el compilador sabe que es un String. Tampoco se implementan igual en todos los lenguajes: Java los borra al compilar, mientras que C# y Rust conservan información de los tipos concretos.

Preguntas frecuentes

¿Qué significa la `T` en `List<T>`?

Es un parámetro de tipo, un nombre provisional para el tipo que se indicará al usar la clase. Por convención se usa T, y también E para elementos o K y V para clave y valor.

¿Existen en Python?

No de forma obligatoria, pero el módulo typing permite anotar tipos genéricos como list[int] para que herramientas externas los comprueben.