子类型化和包含之间有什么区别?

What is the difference between subtyping and subsumption?

子类型和包含之间有什么区别?包含是否意味着隐式强制?

是的,你基本上是对的。

子类型是两个 类型 的关系。就其本身而言,它并没有说明这种关系实际上如何应用于表达式的类型。

包含通常意味着存在 表达式 的类型化规则,允许隐式地将子类型化应用于它们的类型。有些语言有子类型但没有包含规则,并且必须使用特殊类型注释(例如 OCaml)显式调用它。

子类型是否为 "coercive" 也有一些独立的方面。强制子类型化会改变它所应用的值。例如,在 Int < Float 的语言中,子类型化可能是强制性的,因为 int 和 float 是不同的域。典型的 OO 风格的对象子类型化通常是非强制性的。然而,这是一个有点模糊的概念,因为它通常取决于语义模型的选择,并且不一定会产生可观察到的差异(除非一种语言允许使用向下转换来反转子类)。实际上,它指的是实现技术而不是语义。