Dart 为什么我可以分配列表<;动态>;到列表<;字符串>;?
我对dart的类型检查工作感到困惑。如图所示,将常规Dart 为什么我可以分配列表<;动态>;到列表<;字符串>;?,dart,Dart,我对dart的类型检查工作感到困惑。如图所示,将常规列表分配给列表是可以的。这基本上意味着我可以分配该列表中的任何内容,而不仅仅是字符串。为什么呢 void main(){ 清单a; a=[1];//通过 a=新列表();//失败 a=1;//失败 a=新列表();//通过 a、 添加(1);//失败 } 动态类型是特殊的。这真的意味着“关闭所有类型检查,我知道我在做什么” 在您的示例中,将列表实例分配给列表变量。静态类型检查器看到:从列表到列表,这没关系,类型参数是动态的,所以我根本不检查,程
列表
分配给列表
是可以的。这基本上意味着我可以分配该列表中的任何内容,而不仅仅是字符串
。为什么呢
void main(){
清单a;
a=[1];//通过
a=新列表();//失败
a=1;//失败
a=新列表();//通过
a、 添加(1);//失败
}
动态类型是特殊的。这真的意味着“关闭所有类型检查,我知道我在做什么”
在您的示例中,将列表
实例分配给列表
变量。静态类型检查器看到:从列表到列表,这没关系,类型参数是动态的,所以我根本不检查,程序员必须知道他在做什么
无论何时将dynamic
用作一种类型或作为一种类型的一部分,您都要对键入的正确性承担全部责任。系统会让你做任何你想做的事
即使没有动态
,省道式系统也不安全。这意味着您可以创建没有静态类型警告的程序,而静态类型警告在运行时仍然会因类型错误而失败。
事实上,大多数语言都有这个问题,只要它们包含参数化类型,并且带有同变或反变子类型。或强制转换。声明和重新定义不应引用不同的签名/数据类型。即使使用动态,它也应该包含相同类型的内容,不能将多个数据类型内容合并到列表实例中。如果您想拥有多类型数据,可以使用ArrayList。谢谢,这就解释了。我没有看到动态意味着没有类型检查。如果我改为尝试将列表
分配给列表
,那么静态类型检查器会根据我的需要进行投诉。对象
和动态
之间的区别让我感到困惑。@tusj这是一本关于这个主题的好读物: