mez*_*oni 3 null virtual-machine dart bottom-type dart-sdk
在 Dart 中存在两种类型。
这是Dart 语言规范中的证明:
null的静态类型是底部。
null
是Null
null
是bottom
这意味着 Dart 中的对象可以有两种类型。
一种调用的真实类型static
和一种virtual
调用的类型runtime
。
也就是说,运行时类型null
不是 abottom
而是一个普通的 class Null
。
class Null {
factory Null._uninstantiable() {
throw new UnsupportedError('class Null cannot be instantiated');
}
/** Returns the string `"null"`. */
String toString() => "null";
}
Run Code Online (Sandbox Code Playgroud)
但是同时具有这个常规运行时类型的Null
值可以分配给任何其他类型,因为 的真实(静态)类型null
是一种bottom
类型。
在 Dart 中如何称呼这种技术?
类型替换或不同的东西?
聚苯乙烯
这个问题是关于值的静态类型,而不是关于使用类型注释声明的变量的静态类型。
这是因为 thenull
不是变量,而是value
带有static type
of bottom
。
聚苯乙烯
非常奇怪的案例(至少对我而言)。
void main() {
Null _null;
String s = _null;
}
Run Code Online (Sandbox Code Playgroud)
我收到警告:
A value of type 'Null' cannot be assigned to a variable of type 'String'
Run Code Online (Sandbox Code Playgroud)
这是非常正确的。但同时这也有效。
? 类型替换(静态和运行时)的奇怪之处。
Dart值的运行时类型是它的类。Dart表达式的静态类型是静态类型推断派生出来的,它属于静态类型的世界。这个世界不仅仅是在程序中声明的类。“bottom”类型、“dynamic”类型和函数类型“int->int”都是不对应类的静态类型的例子。
或者换句话说:值有类,表达式有类型(就像在许多其他语言中一样)。没有“静态类型的值”,因为静态类型存在于编译时,而值只存在于运行时 [1]。
静态类型推断算法在 Dart 语言规范中指定。它就是这样,它所需要的只是在某种程度上与程序的运行时行为兼容。
静态类型系统是一种程序分析,它试图检测可能的编程错误,仅此而已。如果您有静态类型警告,则认为您可能有错误,但不确定。类型推断系统应该给出很少的错误警告,并且不能检测到很少的实际错误,同时还应该足够简单以进行描述、理解和实现。
选择“bottom”作为“null”的类型只是使静态类型系统匹配类型之间的“可分配”关系的一种方式,这是在运行时检查的赋值,而不必在任何地方显式检查“Null”。这只是一种算法,碰巧给出了有用的结果。
静态类型在运行时不存在。例如,VM 根本不包含静态类型系统的实现。
/L
[1] 好吧,编译时常量表达式除外。
归档时间: |
|
查看次数: |
511 次 |
最近记录: |