作为一个来自 python 和 javascript 的完整 Dart 初学者,我发现这种行为很奇怪:
var user = {'name': 'John Doe', 'birth_y': 1980};
2021-user['birth_y'] // is 41
但是如果操作员在右边。
user['birth_y'] + 41 // error
错误:
Error: The operator '+' isn't defined for the class 'Object'.
- 'Object' is from 'dart:core'.
Try correcting the operator to an existing operator, or defining a '+' operator.
user['birth_y'] + 41;
^
从错误中,有人猜测对于混合类型的映射,条目具有类型“对象”,然而:
user['birth_y'] is int // true
user['birth_y'].runtimeType // int
这种行为也表现在混合类型的列表中, 我错过了什么?
答案 0 :(得分:1)
Dart 在运行之前会对您的程序进行静态分析。在这个分析阶段,它会查看变量的数据类型,看看它是否是静态安全的。
就您而言,您有这个 Map
:
var user = {'name': 'John Doe', 'birth_y': 1980};
由于您的 Map
包含不同类型的值,Dart 将尝试查看可用于所有值的数据类型。在这种情况下,String
和 int
唯一共享的是 Object
类型。因此 user
被分析为 Map<String, Object>
类型。
这意味着当您从 user
获取对象时,分析器唯一可以确定的是它的类型为 Object
。
所以当你这样做时:
user['birth_y'] + 41
分析器会假设您得到一个没有 Object
运算符的 +
。
您通常不应将 Map
用作某种包含不同数据类型的对象。而是创建一个 class
,它可以编写类型安全的代码。