Os xénericos permiten crear clases, interfaces e funcións que traballan cun tipo arbitrario, sen necesidade de duplicar código para cada tipo de dato.
Se observas a clase List na documentación, verás que realmente se define como List<E>. Isto significa que List é un tipo xenérico, onde E representa o tipo dos elementos da lista.
List<String> nomes = ['Ana', 'Brais', 'Clara'];
💡 A notación
<...>permite parametrizar o tipo que se usa nese momento.
Por convención, as letras máis usadas como variables de tipo son: T, E, K, V, S.
🎯 Por que usar xénericos?
- ✅ Maior seguridade de tipos en tempo de compilación.
- 🔁 Evita duplicación de código (podes usar a mesma clase ou función para distintos tipos).
- ⚙️ Mellor rendemento (xeneración de código máis eficiente).
🧩 Evitar duplicación con xénericos
Sen xénericos teriamos que crear unha interface por cada tipo:
abstract class StringCache {
String getByKey(String chave);
void setByKey(String chave, String valor);
}
abstract class IntCache {
int getByKey(String chave);
void setByKey(String chave, int valor);
}
Co uso de xénericos:
abstract class Cache<T> {
T getByKey(String chave);
void setByKey(String chave, T valor);
}
📌 Así reutilizamos a lóxica para calquera tipo (
T), sen repetir código.
🧺 Coleccións con tipo
Podes crear listas, conxuntos e mapas tipados:
var nomes = <String>['Ana', 'Brais'];
//Equivalente a: List<String> nomes = ['Ana', 'Brais'];
var únicos = <String>{'Ana', 'Brais'};
//Equivalente a: Set<String> únicos = {'Ana', 'Brais'};
var páxinas = <String, String>{
'index.html': 'Inicio',
'robots.txt': 'Instruccións bots',
};
/*
Equivalente a:
Map<String, String> páxinas = {
'index.html': 'Inicio',
'robots.txt': 'Instruccións bots',
};
*/
Exemplos
📚 Máis información
Os xenéricos ofrecen moitas máis posibilidades, pero non se profundará máis por estar fóra do alcance dos contidos do módulo de PMDM.
Para quen desexe ampliar coñecementos, recoméndase consultar a documentación oficial de Dart sobre generics: