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: