Dart: определение / проверка типа списка во время выполнения

#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. Вы уверены, что ваш метод принимает список в качестве аргумента и не заботится о типе? Потому что вы должны правильно написать этот метод, используя общие термины. Можете ли вы привести пример вашего метода?