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



如果我们对此进行测试,

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

如果我们测试一下,

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

这在技术上是正确的,因为List稍后可能会得到另一种类型的对象。

有没有任何方法可以通过列表的元素来确定列表的类型,或者我需要使用循环来检查每个元素的类型?

您对第二个示例的看法是错误的。以下返回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>的特性被称为隐式动态,并且在引入不可为null时将消失。如果您遵循以下指南,您也可以立即禁用此功能:

https://dart.dev/guides/language/analysis-options#enabling-附加类型检查

如果您禁用此功能,您将通过Dart分析器得到一个错误:

缺少列表文字的类型参数。请尝试添加类似"dynamic"的显式类型,或在分析选项文件中启用隐式dynamic。

最新更新