编译时不会管定义的数据类型 , 运行时才处理变量的类型
关于动态的另一个观点是它不是真正的类型
它是一种关闭类型检查并告诉静态类型系统“相信我,我知道我在做什么”的方法。
写 dynamic o; 声明了一个没有类型的变量——它被标记为“没有类型检查”。
当你写 Object o = something;你是在告诉系统它不能假设任何关于 o 的东西,除非它是一个对象。
您可以调用 toString 和 hashCode 因为这些方法是在 Object 上定义的,但是如果您尝试执行 o.foo() 您将收到警告 - 它看不到您可以这样做,因此它会警告您您的代码可能是错的。
如果你写dynamic o = something,你是在告诉系统不要假设任何东西,也不要检查任何东西。如果你写 o.foo() 那么它不会警告你。你告诉它“任何与 o 相关的东西都可以!相信我,我知道我在做什么”,所以它认为 o.foo() 是可以的。
强大的力量伴随着巨大的责任
如果您禁用变量的类型检查,则需要您确保您没有做错任何事情。
不要使用 List.from(),除非你想要更改结果的类型
如果使用 List.from
方法的话,如果不指定泛型类型,会抹除集合的类型,变成 dynamic
var list = ['a', 'b']; var copy1 = list.toList(); var copy2 = List.from(list); print(copy1.runtimeType); // List<String> print(copy2.runtimeType); // List<dynamic>
运行进显示动态类型
dynamicDemo() { dynamic d = "test"; // 打印 dynamic 变量的运行时类型 print(d.runtimeType); // 打印 dynamic 变量值 print(d); // 调用 dynamic 变量的方法, 静态编译时无法检查其中的错误, 运行时会报错 //d.getName(); // 为 dynamic 变量赋值 int 数据 d = 666; // 打印 dynamic 变量的运行时类型 print(d.runtimeType); // 打印 dynamic 变量值 print(d); } main() { dynamicDemo(); } //String //test //int //666