如果我们对此进行测试,
print([1] is List<int>); // prints true
如果我们对此进行测试,
List a = [1];
print(a is List<int>); // prints false
从技术上讲,这是正确的,因为列表稍后可能会获得另一种类型的对象。
是否可以通过其元素确定列表的类型,还是需要使用循环检查每个元素的类型?
答案 0 :(得分:0)
您对第二个示例是错误的。以下内容返回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>
的功能称为隐式动态功能,当引入不可为空的功能时,该功能将消失。如果您遵循此指南,也可以立即禁用此功能:
https://dart.dev/guides/language/analysis-options#enabling-additional-type-checks
如果禁用此功能,则Dart分析仪会出现错误:
列表文字缺少类型参数。尝试添加诸如“动态”之类的显式类型,或在分析选项文件中启用隐式动态。