Комментарии (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, обеспечивающая баланс между гибкостью и безопасностью типов.