3

在 Dart 中存在两种类型。

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

这是Dart 语言规范中的证明:

null的静态类型是底部。

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

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

一种调用的真实类型static和一种virtual调用的类型runtime

也就是说,runtime type ofnull不是 abottom而是常规 class 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 中如何称呼这种技术?

类型替换或不同的东西?

附言

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

这是因为 thenull不是变量,而是value带有static typeof bottom

附言

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

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

我收到警告:

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

这是非常正确的。但同时这也有效。

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

4

2 回答 2

5

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

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

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

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

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

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

/L

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

于 2014-02-19T10:07:29.840 回答
1

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

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

于 2014-02-19T05:33:28.520 回答