Dart 2中的动态类型可以分配给差异类型的值以及编译如何推断它们?
例如,dart 2中的x类型是什么,这会编译吗?
dynamic x = 1;
x = x + "Hello";
答案 0 :(得分:4)
dynamic
类型很特别。这真的意味着“相信我,我知道我在做什么"它会关闭一些静态类型检查。
作为类型约束,dynamic
实际上等同于Object
(您可以将任何值赋给类型为dynamic
的变量),但是当您尝试在对象上调用方法时,即使Object
上不存在该方法,您也可以尝试。
在这种情况下,dynamic x = 1;
有效,因为1
可分配给Object
。
第2行失败。 x = x + "Hello";
尝试以+
作为参数调用1
上的"Hello"
方法,即使存在+
运算符,参数的类型错误。
你说"相信我,我知道我在做什么",所以编译器允许你尝试 - 没有静态警告或错误。你得到他们错误的类型,所以运行时会在事情变得不健全之前阻止你。
您也可以编写x.argleBargleGlopGlyf(42)
,编译器仍然无法阻止您,即使程序中的任何位置都没有argleBargleGlopGlyf
方法。具有强大的静态功能带来了巨大的动态责任。
答案 1 :(得分:3)
在Dart 2中,dynamic
是一种特殊类型的签名 - 表示任何。
在上面的示例中,x
为dynamic
。在第1行的运行时,它将是一个int。因此,如果您撰写print(x is int)
,则会true
。但是,静态地,它是dynamic
。您无法获得代码完成(尝试在IDE中键入x.
。
下一行将是运行时错误(如果输入正确,则为静态错误)。
根据我的经验,使用Dart 2,您很少使用dynamic
关键字。