Menu
Coddy logo textTech

Metodi generici

Fa parte della sezione Programmazione orientata agli oggetti del percorso Dart di Coddy. Lezione 66 di 110.

Proprio come le classi possono essere generiche, anche i singoli metodi possono avere i propri parametri di tipo. Questo è utile quando hai bisogno di un metodo flessibile senza rendere generica l'intera classe.

Un metodo generico dichiara il parametro di tipo prima del tipo restituito:

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
}

Spesso Dart può dedurre il tipo dagli argomenti, quindi non è sempre necessario specificarlo esplicitamente:

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

I metodi generici sono particolarmente utili all'interno delle classi quando solo alcune operazioni necessitano di flessibilità nei tipi:

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 dedotto come int
  
  var copies = printer.duplicate('Hi', 3);
  print(copies);  // [Hi, Hi, Hi]
}

I metodi generici ti offrono un controllo dettagliato sulla sicurezza dei tipi a livello di metodo, mantenendo le tue classi più semplici e beneficiando comunque del controllo dei tipi in fase di compilazione.

challenge icon

Sfida

Facile

Costruiamo un’utilità per la trasformazione dei dati che mostri la potenza dei metodi generici. Creerai una classe Transformer con metodi che possono funzionare con qualsiasi tipo, offrendoti flessibilità senza rendere generica l’intera classe.

Organizzerai il codice in due file:

  • transformer.dart: crea una classe Transformer con questi metodi generici:
    • T getFirst<T>(List<T> items) - restituisce il primo elemento di una lista
    • T getLast<T>(List<T> items) - restituisce l’ultimo elemento di una lista
    • List<T> repeat<T>(T item, int times) - crea una lista contenente l’elemento ripetuto il numero di volte specificato
    • void printPair<A, B>(A first, B second) - stampa due valori nel formato Pair: [first] and [second]
  • main.dart: importa il file del trasformatore e mostra ciascun metodo generico con tipi diversi:
    • Crea un’istanza di Transformer
    • Usa getFirst su [10, 20, 30] e stampa il risultato
    • Usa getFirst su ['apple', 'banana', 'cherry'] e stampa il risultato
    • Usa getLast su [1.5, 2.5, 3.5] e stampa il risultato
    • Usa repeat per creare una lista con 'Hi' ripetuto 4 volte e stampa il risultato
    • Usa repeat per creare una lista con 7 ripetuto 3 volte e stampa il risultato
    • Usa printPair con 'Name' e 42
    • Usa printPair con 100 e true

Nota come ciascun metodo dichiari i propri parametri di tipo, consentendo allo stesso oggetto Transformer di lavorare con numeri interi, stringhe, numeri in virgola mobile e valori booleani, il tutto con la piena sicurezza dei tipi. Il metodo printPair mostra l’uso di due parametri di tipo in un singolo metodo.

Output previsto:

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

Provalo tu

import 'transformer.dart';

void main() {
  // Crea un'istanza di Transformer
  var transformer = Transformer();

  // TODO: Usa getFirst su [10, 20, 30] e stampa il risultato

  // TODO: Usa getFirst su ['apple', 'banana', 'cherry'] e stampa il risultato

  // TODO: Usa getLast su [1.5, 2.5, 3.5] e stampa il risultato

  // TODO: Usa repeat per creare una lista con 'Hi' ripetuto 4 volte e stampala

  // TODO: Usa repeat per creare una lista con 7 ripetuto 3 volte e stampala

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

  // TODO: Usa printPair con 100 e true
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Programmazione orientata agli oggetti

Esercitati da solo: Compilatore Dart online