我正在学习Kotlin中的子类型和超类型,并最初假定这些术语表示继承的类和父类。但是在阅读了JetBrains的这篇文章后,我不确定我确切地理解了子类型化的含义。
该帖子解释说Any
是Any?
(有意义)Number
的子类型,是的子类型Any
,并且Int
是的子类型Number
。到目前为止,效果很好(Any?
-> Any
-> Number
-> Int
)和(Any?
-> Number?
-> Int?
)。
但是请注意图5:
此图(及随附的文本)暗示并说明这Number
是其可为空的对应项的子类型Number?
,并且Int
也是其可为空的对应项的子类型Int?
。这听起来很直观,直到您记住它Int
也是的子类型Number
和Number
的子类型Any
!这与Kotlin文档直接矛盾,后者规定:
Kotlin支持单父类继承-因此,每个类(根类Any除外)都只有一个父类,称为超类。
我假设子类型本身不是子类(一个类可以一次是一个以上父类的子类型吗?)。如果是这样,有人可以为我澄清一下Kotlin中“亚型”和“超型”的含义吗?
类型和类是不同的东西。类型用于限制变量,属性和函数参数的值或函数返回值。类型可能与类匹配,但也可能与接口匹配。
一个类只能有一个直接超类,但是一个类型可以有许多直接超类,可能是以下任何一种
Any
Any
,即使该类型是接口类型(接口没有超类)而子类型将是
Nothing
其被视为一切的子类型的对象。在您的示例中,Number
不是的超类Int
。它是一个接口,因此只是一个超类型。的直接超类Int
是Any
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句