在 Dart 语言中,dynamic 的一个角度看来,它不是真正意义上的一种类型,可以认为dynamic
是一种关闭编译器类型检查的开关,使用它定义的类型就相当于告诉了并告诉静态类型系统:不要管我了,我知道我在干嘛。
比如说在代码中定义一个类型dynamic o;
变量o
就相当于一个没有定义类型的变量,打上了一个“忽略类型检查”的标签。
当我们在用Object
定义变量的时候Object o = something;
就相当于告诉静态类型系统只会调用Object类下面的东西。可以调用toString
和hashCode
,因为这些方法定义在了Object
类下,但是不可以调用o.foo()
否则会得到一个警告,因为这个方法没有定义在Object
下面,系统不知道你要干些什么,代码可能是错误的。
如果你写 dynamic o = something;
,你告诉系统不做任何假设,也不进行任何检查。如果你写 o.foo(),它不会给出警告。你告诉它“与 o 有关的一切都是 OK 的!相信我,我知道我在做什么”,所以它认为 o.foo() 是 OK 的。
权力越大,责任越大,如果你为一个变量禁用类型检查,责任就落实到了你的身上,确保你不会做错任何事情。
翻译自:What is the difference between dynamic and Object in dart? – Stack Overflow