Что такое Generics?

«Что такое Generics?» — вопрос из категории Dart Core, который задают на 29% собеседований Flutter Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Основная идея: Заменить конкретный тип параметром (например, T, E, K, V), который будет указан позже.

Пример универсального класса Box:

class Box<T> {
  final T contents;
  Box(this.contents);

  T getItem() => contents;
}

void main() {
  var intBox = Box<int>(42); // T заменяется на int
  var stringBox = Box<String>('Hello'); // T заменяется на String
  // stringBox.getItem() + 5; // ОШИБКА КОМПИЛЯЦИИ: String + int
}

Ограничение типов с помощью extends:

// Класс работает только с типами, являющимися подтипами num (int, double)
class NumericContainer<T extends num> {
  List<T> _values = [];
  void add(T value) => _values.add(value);
  T sum() => _values.fold(0 as T, (a, b) => (a + b) as T);
}

void main() {
  var container = NumericContainer<int>();
  container.add(10);
  container.add(20);
  print(container.sum()); // 30
  // var badContainer = NumericContainer<String>(); // Ошибка компиляции
}

Где это используется в Dart/Flutter:

  • Коллекции: List<E>, Map<K, V>, Set<E>.
  • Асинхронность: Future<T>, Stream<T>.
  • Виджеты: ValueListenableBuilder<T>, FutureBuilder<T>.
  • State Management: Provider<T>, Riverpod's Provider<T>.

Видео-ответы