【问题标题】:What means in Dart static type and why it differs with runtime type?Dart 静态类型的含义是什么,为什么它与运行时类型不同?
【发布时间】:2014-02-19 05:28:44
【问题描述】:

在 Dart 中存在两种类型。

  1. 运行时类型
  2. 静态类型

这是Dart language specification中的证明:

null的静态类型是底部。

  1. null 的运行时类型为Null
  2. null 的静态类型为bottom

这意味着 Dart 中的对象可以有两种类型。

一种称为static 的真实类型和一种称为runtimevirtual 类型。

也就是说,null 的运行时类型不是bottom,而是常规类Null

class Null {
  factory Null._uninstantiable() {
    throw new UnsupportedError('class Null cannot be instantiated');
  }

  /** Returns the string `"null"`. */
  String toString() => "null";
}

但同时,此常规运行时类型 Null 的值可以分配给任何其他类型,因为 null 的真实(静态)类型是 bottom 类型。

Dart 中如何称呼这种技术?

类型替换还是别的什么?

附言

这个问题是关于值的静态类型,而不是关于使用类型注释声明的变量的静态类型。

这是因为null 不是变量,而是valuestatic typebottom

附言

非常奇怪的案例(至少对我来说)。

void main() {
  Null _null;
  String s = _null;
}

我收到警告:

A value of type 'Null' cannot be assigned to a variable of type 'String'

说的很对。但同时这也有效。

具有类型替换(静态和运行时)的奇特事物。

【问题讨论】:

  • “null 不能分配给字符串”警告似乎是一个错误(在分析器中或在规范中)。静态可确定的是,所有 Null 类型的值都可以分配给 String 类型的变量。
  • @lrn 我只是依靠事实。

标签: null dart virtual-machine dart-sdk bottom-type


【解决方案1】:

Dart value 的运行时类型是它的类。 Dart 表达式 的静态类型是静态类型推断得出的,它属于静态类型的世界。这个世界不仅仅是在程序中声明的类。 “bottom”类型、“dynamic”类型和函数类型“int->int”都是不对应类的静态类型示例。

或者换句话说:值有类,表达式有类型(就像在许多其他语言中一样)。 没有“静态值类型”,因为静态类型存在于编译时,而值仅存在于运行时 [1]。

Dart 语言规范中指定了静态类型推断算法。它就是它,它所需要的只是它在某种程度上与程序的运行时行为兼容。

静态类型系统是一种程序分析,它试图检测可能的编程错误,不多也不少。如果您有静态类型警告,则可能但不确定您有错误。类型推断系统应该给出很少的错误警告,并且无法检测到很少的实际错误,同时还应该足够简单,易于描述、理解和实现。

选择“bottom”作为“null”的类型只是使静态类型系统匹配类型之间的“可赋值”关系的一种方法,这是赋值在运行时检查的内容,而无需显式检查“Null”到处。 这只是一个恰好给出有用结果的算法。

静态类型在运行时不存在。例如,VM 根本不包含静态类型系统的实现。

/L

[1] 好吧,编译时常量表达式除外。

【讨论】:

  • 在计算机科学中,一个值是一个不能被进一步计算的表达式(一个范式)。你的话“值有类,表达式有类型”是不正确的。您还说“没有“静态值类型”,因为静态类型存在于编译时,而值仅存在于运行时”。例如,表达式“1 + 2”不是一个值,因为它可以简化为表达式“3”。正如我所说的“一个值是一个无法进一步评估的表达式”。所以,我在很多情况下都不同意你的观点,包括“值有类,表达式有类型”。
  • 但是如果您将术语 value 更改为术语 instance 这将是正确的。但是你说的不是instance,而是value。所以,我在陈述一个事实。你的判断是错误的
  • “选择”底部“作为”null“的类型只是一种方式......”。这是一个正确的方法。但是让Null 类对用户代码可见是错误的。它必须是内部类型或私有类_Null。这将自动删除您为什么要妥协的所有问题,因为在这种情况下,由于此类(或类型,如果它是内部类型)的可见性保护级别,表达式 value is Null 将是不可能的。
  • 如果你只有语法,那么值就是表达式。对于重写语义,这就是你得到的。如果你有指称语义,那么你的语法和你的值可能存在于不同的域中。
  • 我不关心语义。我是关于语法的。使用这种语法我们会得到什么语义?您的妥协使得使用正确的语法(对于所有类型的对象都相同),我们对某些类型的对象获得不同的语义。在我们的例子中,null 值和 Null 类。但是,如果使用null 值,我们没有问题比使用公共Null 类具有与所有其他类似类不同的语义。在源代码中我们可以看到 Null 类是底部类型?无处。我可以将其称为源代码中具有相同语法的妥协(不同)语义!!!
【解决方案2】:

当您声明一个类并编写类型注释时,这是静态类型。 由于在运行时不使用类型注释,您可以将Foo 类型的值分配给Bar 类型的变量。即使静态类型是Foo,运行时类型也是Bar

可能是错的。我还没有仔细研究这些问题。

【讨论】:

  • 请给我一个在检查模式下工作的例子(如null)。此外,如果您不知道我们将注释添加到变量(值存储)而不是值。 null 未声明为变量。它是某种类型的值(底部类型的值)。您说“即使静态类型是 Foo,运行时类型也是 Bar”。静态类型是什么?值的静态类型还是变量的静态类型?我问的是关于静态类型值的问题,而不是关于静态类型变量的问题。这是非常不同的概念 请记住null 不是变量(存储),它只是一个值(右值)。
猜你喜欢
  • 2010-10-25
  • 2014-09-27
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多