Dart中动态和静态类型的区别

时间:2014-09-12 04:57:41

标签: dynamic dart

两个问题。 第一, 以下是强类型。

String msg = "Hello world.";
msg = "Hello world again.";

而且,低于动态

var msg = "Hello world.";
msg = "Hello world again.";

上面两个'msg之间有什么区别吗?

其次,如果我使用'new'关键字来启动如下变量,

Map myMap = new Map;

为什么要指示变量'myMap'是一个Map实例(Map myMap),因为'new'关键字已经包含了相同的含义?所以,不是没关系,

myMap = new Map;

因为'new'关键字已经暗示新发起的变量既是变量又是Map类型,我无法理解为什么'Map'关键字通常带有变量名,甚至'var'也是如此。

有没有人对此有任何想法(似乎有点多余)Dart语法?

3 个答案:

答案 0 :(得分:3)

String msg = "Hello world.";
msg = "Hello world again.";
msg = 1; // exception in checked mode - int can not be assigned to String.


var msg = "Hello world.";
msg = "Hello world again.";
msg = 1; // ok in checked mode

Checked模式是开发人员模式,其中检查类型注释并在代码违反时创建运行时异常。

在未选中(生产)模式下,如果添加类型注释和哪一个注释,则没有任何区别。这是出于性能原因,因为检查模式较慢。

答案 1 :(得分:2)

关于第一个问题,每个msg变量包含的内容没有区别。

对于Map问题,指定在声明中构造的变量类型的原因是允许子类具有一定的灵活性。以下面的代码为例:

class SubMap extends Map {
  SubMap() : super();
}

Map map = new SubMap();

这里我们有一个变量map,它包含一个SubMap对象作为其值,但我们允许它包含类型Map的值(或其他类型的子类{{1}在以后的时间。

Dart要记住的主要事情是它可选择输入。运行代码时,您的类型注释都不会产生任何差异(除非您以检查模式运行)。注释的类型是帮助您的IDE和其他工具提供自动完成帮助,可能的警告等,其他完全动态的语言,如Javascript不能。

答案 2 :(得分:2)

声明Map myMap = new Map()做了三件事:

  • 它声明了一个名为myMap的变量,其中包含type-annotation Map
  • 使用Map构造函数和
  • 创建一个新对象
  • 它将对象分配给变量。

类型注释意味着myMap具有静态类型Map。静态类型可以在编译时给你一些警告,但它不会在运行时改变任何东西。 类型注释还在已检查模式下添加类型检查,其中检查对变量的任何分配是否可分配给Map

您创建的对象可以是使用任何构造函数的任何对象。我经常使用new HashMap()代替new Map(),并仍然将其分配给键入为Map的变量。

然后将对象分配给变量,如果处于选中状态,则类型检查成功。

该变量独立于用于初始化它的值。如果稍后将字符串分配给myMap变量,则它将在检查模式下失败。

因此,两个msg变量之间的区别在于,一个变量具有静态类型,并且在检查模式下具有类型检查。 对于您显示的代码,行为没有区别。

如果下一行是var y = msg + 42;,则输入的版本会发出警告(msg包含静态类型String,而String.operator+的类型为String->String ,因此42的参数类型无效),无类型版本不会警告您(msg类型为dynamic,因此您可能知道自己在做什么)。< / p>