飞镖:在运行时确定/检查列表类型

时间:2020-09-18 13:16:07

标签: dart

如果我们对此进行测试,

print([1] is List<int>); // prints true

如果我们对此进行测试,

List a = [1];
print(a is List<int>); // prints false

从技术上讲,这是正确的,因为列表稍后可能会获得另一种类型的对象。

是否可以通过其元素确定列表的类型,还是需要使用循环检查每个元素的类型?

1 个答案:

答案 0 :(得分:0)

您对第二个示例是错误的。以下内容返回false的原因是因为您使用List作为类型,而不是使用varfinalList<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分析仪会出现错误:

列表文字缺少类型参数。尝试添加诸如“动态”之类的显式类型,或在分析选项文件中启用隐式动态。