#dart
#dart
Вопрос:
Если мы протестируем это,
print([1] is List<int>); // prints true
и если мы протестируем это,
List a = [1];
print(a is List<int>); // prints false
Что технически правильно, поскольку список может получить другой тип объекта позже.
Есть ли какой-либо способ определить тип списка по его элементам или мне нужно будет использовать цикл для проверки типа каждого элемента?
Ответ №1:
Вы ошибаетесь во втором примере. Причина, по которой следующие результаты возвращаются false
, заключается в том, что вы используете List
тип as вместо использования var
, final
или List<int>
.
List a = [1];
print(a is List<int>); // prints false
Dart видит List
, как List<dynamic>
в вашем примере, и поэтому делает тип списка также содержащим dynamic
:
List a = [1];
print(a is List<int>); // prints false
print(a.runtimeType); // List<dynamic>
Но если вы вместо этого позволите Dart автоматически назначать тип переменной, например:
final a = [1]; // or var
print(a is List<int>); // prints true
print(a.runtimeType); // List<int>
Затем Dart будет статически просматривать содержимое списка при создании списка и назначать правильный тип.
Функция, которая читается List
как List<dynamic>
, называется неявно-динамической и исчезнет при введении ненулевого значения. Вы также можете отключить эту функцию прямо сейчас, если будете следовать этому руководству:
https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks
Если вы отключите эту функцию, анализатор Dart выдаст сообщение об ошибке:
Отсутствует аргумент типа для литерала списка. Попробуйте добавить явный тип, например ‘dynamic’, или включить неявный-dynamic в файле параметров анализа.
Комментарии:
1. Я не хочу возражать против вас или чего-то еще, кроме части «Вы ошибаетесь …»,
List a = [1]; var s = a; print(s is List<int>);
по-прежнему выводит false . Пожалуйста, отредактируйте свой ответ или поправьте меня, если я ошибаюсь. Большое спасибо за ваше время!2. Я фактически принимаю этот список в качестве параметра функции. Итак, есть ли какой-либо способ освободить список от этого типа или сделать его тип более динамичным в этом отношении (при проверке)
3. Тип списка определяется при его инициализации, а тип в дальнейшем указывается в объекте и не изменится, если вы присвоите его переменной другого типа. Опять же, Dart пытается быть умным в вашем примере, автоматически делая ваш код похожим:
List<dynamic> a = <dynamic>[1]
4. Вы уверены, что ваш метод принимает список в качестве аргумента и не заботится о типе? Потому что вы должны правильно написать этот метод, используя общие термины. Можете ли вы привести пример вашего метода?