如果我们对此进行测试,
print([1] is List<int>); // prints true
如果我们测试一下,
List a = [1];
print(a is List<int>); // prints false
这在技术上是正确的,因为List稍后可能会得到另一种类型的对象。
有没有任何方法可以通过列表的元素来确定列表的类型,或者我需要使用循环来检查每个元素的类型?
您对第二个示例的看法是错误的。以下返回false
的原因是使用List
作为类型,而不是使用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>
的特性被称为隐式动态,并且在引入不可为null时将消失。如果您遵循以下指南,您也可以立即禁用此功能:
https://dart.dev/guides/language/analysis-options#enabling-附加类型检查
如果您禁用此功能,您将通过Dart分析器得到一个错误:
缺少列表文字的类型参数。请尝试添加类似"dynamic"的显式类型,或在分析选项文件中启用隐式dynamic。