我对dart的类型检查工作方式感到困惑。如图所示,将一般List<dynamic>
分配给List<String>
即可。这实际上意味着我可以分配该列表中的任何内容,而不仅仅是String
。那是为什么?
void main() {
List<String> a;
a = [1]; // pass
a = new List<int>(); // fail
a = 1; // fail
a = new List<String>(); // pass
a.add(1); // fail
}
答案 0 :(得分:4)
dynamic
类型很特别。它真的意味着“关闭所有类型检查,我知道我在做什么”。
在您的示例中,您将List<dynamic>
实例分配给List<String>
变量。静态类型检查器看到:列表列表,没关系,类型参数是动态的,所以我根本不检查,程序员必须知道他在做什么。
每当您使用dynamic
作为类型或类型的一部分时,您都要对正确的输入负全部责任。系统会让你做任何你想做的事。
即使没有dynamic
,Dart类型系统也不是安全。这意味着您可以创建没有静态类型警告的程序,这些警告在运行时仍会因类型错误而失败。
实际上,大多数语言都存在这个问题,只要它们包含带有共变量或反变量子类型的参数化类型。或演员表。