← Назад к вопросам

Что такое Generics в Dart?

1.3 Junior🔥 172 комментариев
#Dart

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Generics в Dart: Параметризованные типы

Generics (обобщённые типы) — это мощный механизм Dart, позволяющий создавать переиспользуемые компоненты, сохраняя при этом типобезопасность. Они дают возможность определить классы, функции и методы, которые работают с различными типами данных без потери информации о типе.

Основной синтаксис

Generics определяются через угловые скобки <T>, где T — это параметр типа (type parameter):

class Box<T> {
  T value;
  
  Box(this.value);
  
  T getValue() => value;
  void setValue(T newValue) => value = newValue;
}

final intBox = Box<int>(42);
final stringBox = Box<String>("Hello");

print(intBox.getValue()); // 42
print(stringBox.getValue()); // Hello

Generics в коллекциях

Dart активно использует generics для типизированных коллекций:

List<String> names = ["Alice", "Bob", "Charlie"];
Map<String, int> ages = {"Alice": 30, "Bob": 25};
Set<int> uniqueNumbers = {1, 2, 3, 4, 5};

Ограничения типов (Bounds)

Иногда нужно ограничить, какие типы могут использоваться как параметры:

class Comparable<T extends num> {
  T value;
  
  Comparable(this.value);
  
  bool isGreaterThan(T other) => value > other;
}

final intComparable = Comparable<int>(10);
intComparable.isGreaterThan(5); // true

Generics в методах

Обобщённые типы можно использовать в отдельных методах:

T getFirst<T>(List<T> list) {
  if (list.isEmpty) throw StateError("List is empty");
  return list.first;
}

final firstInt = getFirst<int>([1, 2, 3]);
final firstString = getFirst<String>(["a", "b", "c"]);

Flutter примеры

В Flutter generics встречаются повсеместно:

class ValueNotifier<T> {
  T _value;
  
  T get value => _value;
  set value(T newValue) {
    _value = newValue;
    notifyListeners();
  }
}

Future<String> fetchData() async {
  return "Data loaded";
}

Stream<int> countStream() async* {
  for (int i = 0; i < 5; i++) {
    yield i;
  }
}

Множественные параметры типов

Можно использовать несколько параметров:

class Pair<T, U> {
  final T first;
  final U second;
  
  Pair(this.first, this.second);
}

final pair = Pair<String, int>("age", 25);
print("${pair.first}: ${pair.second}"); // age: 25

Практическое значение

Generics делают код:

  • Типобезопаснее — ошибки выявляются на этапе анализа
  • Переиспользуемее — один класс работает со многими типами
  • Понятнее — явно видно, какие типы ожидаются
  • Быстрее — меньше runtime проверок благодаря типизации

Generics — это критическая часть современного Dart, обеспечивающая баланс между гибкостью и безопасностью типов.

Что такое Generics в Dart? | PrepBro