子类型和包含有什么区别?包含是否意味着隐含强制?
答案 0 :(得分:3)
是的,你大部分都是对的。
子类型是两个类型的关系。它本身并没有说明这种关系如何实际应用于表达式的类型。
包含通常意味着存在表达式的输入规则,允许隐式地将子类型应用于其类型。有些语言具有子类型但没有包含规则,并且必须使用特殊类型注释(例如,OCaml)显式调用它。
还有一个独立的方面,即子类型是否是强制性的#34;。强制子类型会更改其应用的值。例如,在Int<浮点数,子类型可能是强制性的,因为整数和浮点数是不同的域。对象的典型OO样式子类型通常是非强制性的。然而,这是一个有点模糊的概念,因为它通常取决于语义模型的选择,并且可能不一定产生可观察的差异(除非语言允许使用向下转换来反转子类型)。在实践中,它指的是实现技术而不是语义。