Ковариантный список в Dart
Список в Dart ковариантен по элементу: List<int>
можно передать туда, где ожидают List<Object>,
потому что каждый int является объектом. Чтение
из такого списка безопасно.
Запись через более широкий тип не запрещает позже добавить элемент другого вида - тогда программа остановится с ошибкой времени выполнения:
void printSizes(List<Object> items) {
print(items.length);
}
final nums = [1, 2, 3];
printSizes(nums);
Ковариантность упрощает передачу готовых списков в общие функции, но добавление «чужого» значения в список с узким типом элементов через широкую ссылку ломает ожидания типа.
Дан следующий код:
class Employee {
final String name;
Employee(this.name);
}
void showNames(List<Object> rows) {
for (final row in rows) {
print(row);
}
}
final team = [Employee("ann"), Employee("bob")];
Передайте team в showNames
и выведите два имени через цикл.
Дан следующий код:
final numbers = <int>[1, 2];
List<Object> wide = numbers;
Сначала вызовите numbers.add(3) и выведите
длину списка. Затем попробуйте wide.add("x")
и запустите программу - убедитесь, что появляется
ошибка времени выполнения.