【问题标题】:null is subtype of object or notnull 是否是对象的子类型
【发布时间】:2022-11-20 05:58:27
【问题描述】:

据我了解,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中的getter定义。

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

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

【问题讨论】:

    标签: dart


    【解决方案1】:

    您指的是 Dart 语言规范和平台库源代码之间交互的一个小痛点。

    很长一段时间,nullObject 的子类型。有了 null safety,这就成了一个问题,它被移动(在语言规范中)成为除了 Object 之外没有超类的第二类。

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

    实现更改了子类型化规则,null 不再是 Object,但没有人抽出时间来更改平台库。无论如何,Null 类型是如此的特殊,以至于平台库源中的声明实际上更像是一个占位符而不是真正的定义。

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

    或者你可以说 nullObject 继承成员实现,实际上没有存在Object 的子类型。用魔法。 这可能接近实际发生的情况。

    更权威的答案是 ObjectNull 都是非常特殊的类,没有超类。 “Object 的成员”(上面提到的五个成员)存在于全部根据法令,Dart 对象和 Object? 类型也是如此(因此您实际上可以在 Object? 上调用它们)。 ObjectNull上那些成员的实际实现是由运行时系统提供的某种程度上来说.

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

    【讨论】:

      猜你喜欢
      • 2022-01-08
      • 1970-01-01
      • 2018-09-10
      • 2016-11-24
      • 1970-01-01
      • 2021-10-16
      • 2021-10-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多