null 是否是对象的子类型

Miz*_*er1 5 dart

据我了解,Object 类是所有类的基类,除了那些允许 null 的类。另外,正如我从 dart.dev 站点上的文档中了解到的,Null 类型位于 Object 类层次结构之外。

但我无法理解以下奇怪现象的原因。

例如,runtimeType getter 定义在 Object 类中,但该 getter 不存在于 Null 类中。同时,文档https://api.dart.dev/stable/2.18.4/dart-core/Null-class.html指出runtimeType是继承的。但不清楚是谁说的?如果来自 Object 类型,那么为什么 Object 类不指示 getter 被重写或继承https://api.dart.dev/stable/2.18.2/dart-core/Object-class.html。同样在 IDE 中,当您跳转到变量“Null a = null”的 getter 定义时,它会跳转到 Object.h 中的 getter 定义。

这就引出了一个问题,Null 是 Object 的子类型吗?

我想了解Null、Object之间的关系。

lrn*_*lrn 5

您指出了 Dart 语言规范和平台库源之间的交互中的一个稍微痛点。

很长一段时间以来,null是 的一个子类型Object。对于空安全性,这成为了一个问题,并且它被移动(在语言规范中)成为除了Object.

两者具有相同的接口成员。两者都有相同的默认实现(至少operator==,可能runtimeTypenoSuchMethod,可能不是hashCode,绝对不是toString……好吧,除非默认toString以 开头if (this == null) return "null";)。

这些实现改变了子类型规则,null不再是Object,但没有人抽出时间来改变平台库。无论如何,该Null类型的特殊情况非常严重,以至于平台库源中的声明实际上更像是占位符而不是真正的定义。

您可以看到当前的库说两者ObjectNull从一些神奇的超类型(如 )中获取其成员Object?,但这不是一个类,因此这不是一个很好的解释。

或者您可以说null继承了 的成员实现Object,但实际上并不是的子类型Object。通过魔法。这可能接近实际发生的情况。

更权威的答案是ObjectNull都是非常特殊的类,没有超类。根据法令,“成员Object”(上面命名的五个成员)存在于所有Dart 对象上,也存在于Object?类型上(因此您实际上可以在 上调用它们Object?)。Object和上这些成员的实际实现Null是由运行时系统以某种方式提供的。

无论如何,不​​要相信源代码就是全部真相。这些课程很特别。