Ответ
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'sProvider<T>.
Видео-ответы
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶
▶