Kotlin 类型、子类型和超类型 vs 类、子类和超类

thu*_*uit 1 kotlin

我正在学习 Kotlin 中的子类型和超类型,最初假设这些术语意味着继承和父类。但是在阅读了 JetBrains 的这篇文章后,我不确定我是否完全理解子类型的含义。

该帖子解释说,它AnyAny?(有道理的)Number的子类型,是 的子类型Any,并且Int是 的子类型Number。到目前为止一切顺利(Any?-> Any-> Number-> Int)和(Any?-> Number?-> Int?)。

但请注意图#5:

在此处输入图片说明

此图(以及随附的文本)暗示并解释了Number是其可为空对应物 的子类型Number?,并且它Int也是其可为空对应物 的子类型Int?。这听起来很直观的,直到你记住,Int也是一个亚型Number,和Number子类型Any!这与 Kotlin 文档直接矛盾,后者指定

Kotlin 支持单父类继承——所以每个类(除了根类 Any)都有一个父类,称为超类。

我假设子类型本身不是子类(一个类可以同时是多个父类的子类型?)。如果是这样,有人可以为我澄清 Kotlin 中“子类型”和“超类型”的确切含义吗?

Ten*_*r04 8

类型与类不同。类型用于限制变量、属性和函数参数的值或函数返回值。类型可能匹配一个类,但它也可能匹配一个接口。

一个类只能有一个直接超,但一个类型可以有多个直接超,可能是

  • 类类型的直接超类,以及该超类的任何超类,等等 Any
  • 类类型实现的接口,以及这些接口的超接口
  • 接口类型的超接口
  • Any, 即使类型是接口类型(接口没有超类)
  • 类型或任何超类型的可空版本

和子类型将是

  • 一个类类型的子类,或这些子类的子类等
  • 接口类型的子接口
  • 可空类型或其子类型的非空版本。
  • Nothing其被视为一切的子类型的对象。

在您的示例中,Number不是Int. 它是一个接口,所以它只是一个超类型。的直接超类IntAny