Kotlin类型,子类型和超类型与类,子类和超类

雷电饼干

我正在学习Kotlin中的子类型和超类型,并最初假定这些术语表示继承的类和父类。但是在阅读了JetBrains的这篇文章后,我不确定我确切地理解了子类型化的含义。

该帖子解释说AnyAny?(有意义)Number的子类型是的子类型Any,并且Int是的子类型Number到目前为止,效果很好(Any?-> Any-> Number-> Int)和(Any?-> Number?-> Int?)。

但是请注意图5:

在此处输入图片说明

此图(及随附的文本)暗示并说明这Number是其可为空的对应项的子类型Number?,并且Int也是其可为空的对应项的子类型Int?这听起来很直观,直到您记住它Int也是的子类型NumberNumber的子类型Any这与Kotlin文档直接矛盾,后者规定:

Kotlin支持单父类继承-因此,每个类(根类Any除外)都只有一个父类,称为超类。

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

Tenfour04

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

一个类只能有一个直接超,但是一个类型可以有许多直接超,可能是以下任何一种

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

而子类型将是

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章