Menu
CoddyTech

Métodos genéricos

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 66 de 110.

Al igual que las clases pueden ser genéricas, los métodos individuales también pueden tener sus propios parámetros de tipo. Esto resulta útil cuando necesitas un método flexible sin hacer que toda la clase sea genérica.

Un método genérico declara su parámetro de tipo antes del tipo de retorno:

T findFirst<T>(List<T> items) {
  return items.first;
}

void main() {
  var firstNumber = findFirst<int>([1, 2, 3]);
  var firstWord = findFirst<String>(['hello', 'world']);
  
  print(firstNumber);  // 1
  print(firstWord);    // hello
}

Dart a menudo puede inferir el tipo a partir de los argumentos, así que no siempre necesitas especificarlo explícitamente:

var result = findFirst([10, 20, 30]);  // Dart infiere int

Los métodos genéricos son especialmente útiles dentro de las clases cuando solo ciertas operaciones necesitan flexibilidad de tipos:

class Printer {
  void printItem<T>(T item) {
    print('Printing: $item');
  }
  
  List<T> duplicate<T>(T item, int count) {
    return List.filled(count, item);
  }
}

void main() {
  var printer = Printer();
  printer.printItem<String>('Hello');
  printer.printItem(42);  // Tipo inferido como int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

Los métodos genéricos te dan un control preciso de la seguridad de tipos a nivel de método, lo que permite mantener tus clases más sencillas y, al mismo tiempo, beneficiarte de la comprobación de tipos en tiempo de compilación.

challenge icon

Desafío

Fácil

Vamos a crear una utilidad de transformación de datos que muestre el poder de los métodos genéricos. Crearás una clase Transformer con métodos que puedan trabajar con cualquier tipo, lo que te dará flexibilidad sin hacer genérica toda la clase.

Organizarás el código en dos archivos:

  • transformer.dart: Crea una clase Transformer con estos métodos genéricos:
    • T getFirst<T>(List<T> items): devuelve el primer elemento de una lista
    • T getLast<T>(List<T> items): devuelve el último elemento de una lista
    • List<T> repeat<T>(T item, int times): crea una lista que contiene el elemento repetido la cantidad de veces especificada
    • void printPair<A, B>(A first, B second): imprime dos valores con el formato Pair: [first] and [second]
  • main.dart: Importa el archivo del transformador y muestra cada método genérico con distintos tipos:
    • Crea una instancia de Transformer
    • Usa getFirst con [10, 20, 30] e imprime el resultado
    • Usa getFirst con ['apple', 'banana', 'cherry'] e imprime el resultado
    • Usa getLast con [1.5, 2.5, 3.5] e imprime el resultado
    • Usa repeat para crear una lista con 'Hi' repetido 4 veces e imprime el resultado
    • Usa repeat para crear una lista con 7 repetido 3 veces e imprime el resultado
    • Usa printPair con 'Name' y 42
    • Usa printPair con 100 y true

Observa cómo cada método declara sus propios parámetros de tipo, lo que permite que el mismo objeto Transformer trabaje con enteros, cadenas, números de coma flotante y valores booleanos, todo con seguridad de tipos completa. El método printPair muestra cómo usar dos parámetros de tipo en un solo método.

Salida esperada:

10
apple
3.5
[Hi, Hi, Hi, Hi]
[7, 7, 7]
Pair: Name and 42
Pair: 100 and true

Pruébalo tú mismo

import 'transformer.dart';

void main() {
  // Crea una instancia de Transformer
  var transformer = Transformer();

  // TODO: Usa getFirst con [10, 20, 30] e imprime el resultado

  // TODO: Usa getFirst con ['apple', 'banana', 'cherry'] e imprime el resultado

  // TODO: Usa getLast con [1.5, 2.5, 3.5] e imprime el resultado

  // TODO: Usa repeat para crear una lista con 'Hi' repetido 4 veces e imprímela

  // TODO: Usa repeat para crear una lista con 7 repetido 3 veces e imprímela

  // TODO: Usa printPair con 'Name' y 42

  // TODO: Usa printPair con 100 y true
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online