void foo() {
final fooMap = {
'one': true,
};
bar(fooMap);
}
void bar(Map<String, Object> barMap) {
barMap['two'] = 'Hello World';
}
在上面的代码中,我收到错误:
DartError: TypeError: "Hello World": type 'String' is not a subtype of type 'bool'
据我了解,这是因为
Map<String, bool>
不是 Map<String, Object>
的子类型。如果我的理解是正确的,我不知道为什么我的 IDE 不告诉我不要这样做。
在
foo()
中,如果我将 final fooMap...
更改为 Map<String, Object> fooMap...
,那么一切都会正常工作。但同样,我觉得 IDE 应该捕获它,让我知道这一点。
在
bar()
中,如果我将地图复制到新的Map<String, Object>
中,它也可以工作。
我的问题是,我该如何处理?这里有强类型选项吗?我更喜欢在编译时捕获这样的事情,而不是运行时。
Dart 的类型推断能力强;
Map
的类型将通过其条目推断出来。
final map = {
'one': true,
};
与
相同final Map<String, bool> map = {
'one': true,
};
您不会收到
bar
函数的编译错误,因为从技术上讲,地图的 Map<String, bool>
类型会使用参数的 Map<String, Object>
类型进行编译。
在 Dart 中,因为 一切都是
Object
类型(除了 null
)。
final one = true;
print(one is Object); // true
如果您想在地图上允许
dynamic
值,您可以采用几种不同的方式。
final map = <String, dynamic>{
'one': true,
};
final map = {
'one': true,
'two': 'hello world',
};
警告: 这种方式仅在您提供不同类型的多个
value
时才有效。
如果您提供相同类型的多个条目,地图的推断类型不会改变
// type: Map<String, bool>
final map = {
'one': true,
'two': false,
};