Dart 为什么我可以分配列表<;动态>;到列表<;字符串>;?

Dart 为什么我可以分配列表<;动态>;到列表<;字符串>;?,dart,Dart,我对dart的类型检查工作感到困惑。如图所示,将常规列表分配给列表是可以的。这基本上意味着我可以分配该列表中的任何内容,而不仅仅是字符串。为什么呢 void main(){ 清单a; a=[1];//通过 a=新列表();//失败 a=1;//失败 a=新列表();//通过 a、 添加(1);//失败 } 动态类型是特殊的。这真的意味着“关闭所有类型检查,我知道我在做什么” 在您的示例中,将列表实例分配给列表变量。静态类型检查器看到:从列表到列表,这没关系,类型参数是动态的,所以我根本不检查,程

我对dart的类型检查工作感到困惑。如图所示,将常规
列表
分配给
列表
是可以的。这基本上意味着我可以分配该列表中的任何内容,而不仅仅是
字符串
。为什么呢

void main(){
清单a;
a=[1];//通过
a=新列表();//失败
a=1;//失败
a=新列表();//通过
a、 添加(1);//失败
}

动态
类型是特殊的。这真的意味着“关闭所有类型检查,我知道我在做什么”

在您的示例中,将
列表
实例分配给
列表
变量。静态类型检查器看到:从列表到列表,这没关系,类型参数是动态的,所以我根本不检查,程序员必须知道他在做什么

无论何时将
dynamic
用作一种类型或作为一种类型的一部分,您都要对键入的正确性承担全部责任。系统会让你做任何你想做的事

即使没有
动态
,省道式系统也不安全。这意味着您可以创建没有静态类型警告的程序,而静态类型警告在运行时仍然会因类型错误而失败。
事实上,大多数语言都有这个问题,只要它们包含参数化类型,并且带有同变或反变子类型。或强制转换。

声明和重新定义不应引用不同的签名/数据类型。即使使用动态,它也应该包含相同类型的内容,不能将多个数据类型内容合并到列表实例中。如果您想拥有多类型数据,可以使用ArrayList。谢谢,这就解释了。我没有看到动态意味着没有类型检查。如果我改为尝试将
列表
分配给
列表
,那么静态类型检查器会根据我的需要进行投诉。
对象
动态
之间的区别让我感到困惑。@tusj这是一本关于这个主题的好读物: