
_START_ARTICLE_
子类型
_START_SECTION_
例子
_START_PARAGRAPH_
右图中给出了子类型的一个简单实际例子。一般性对象“鸟”（或超类型）引发了三个派生对象（或子类型）“鸭子”、“杜鹃”和“鸵鸟”。每个都以自己的方式改变了基本的“鸟”的概念，但仍继承了很多“鸟”的特征。一个数据对象可以被声名为这四种类型中任何一个。这个图中使用了UML 符号，箭头指示方向和超类型和它的子类型之间的联系。_NEWLINE_在多数基于类的面向对象编程语言中，子类引出子类型：如果 A 是 B 的子类，则类A 的实例可以用在期望类B 的实例的任何上下文中；所以我们称A 是 B 的子类型。一个结论就是声明有类型B 的任何变量或形式参数在运行时间可以持有类A 的一个值；在这种情况下很多面向对象编程者会声称B 是这个变量的“静态类型”而 A 是它的“动态类型”。这个规则的例外包括C++语言中的私有继承（它不创建子类型），和 Eiffel 语言中在派生类型上特定运算，在其中继承自基类的特征可以用违反子类型规则的方式去除或修改。_NEWLINE_另一个例子是可以允许整数值被用在期望浮点数值的地方，或可以定义包含整数和实数二者的一个类型number 的语言。在第一种情况下，整数类型将是浮点数类型的子类型；在第二种情况下，这两个类型都是number 的子类型而相互之间无子类型关系。_NEWLINE_编程者可利用子类型来以比没有它更抽象的方式来写代码。考虑下面的例子:_NEWLINE_function max (x as number, y as number) is_NEWLINE_  if x < y then_NEWLINE_    return y_NEWLINE_  else_NEWLINE_    return x_NEWLINE_end_NEWLINE_如果整数和实数都是number 的子类型，则二者任何类型都可以传递给这个函数。为此，子类型经常被认为是一种形式的多态性。上述例子也可以比较于C++ 语言的模板。_NEWLINE_在类型论中，子类型关系经常写为<:，有着 A<:B 意味着A 是 B 的子类型。在类型论中子类型可用如下事实来特征化，如果 A<:B，类型 A 的任何表达式也可被给予类型B；立法这个特征化的形式类型规则叫做“包容”规则。
_START_SECTION_
函数类型
_START_PARAGRAPH_
对于函数类型T₁ → T₂，其子类型为S₁ → S₂，则T₁ <: S₁且S₂ <: T₂。参数类型S₁ → S₂为逆变，返回类型为协变。 _NEWLINE_允许副作用的语言，如大部分面向对象语言，子类型化还不足以保证安全在另一个上下文中使用。行为子类型化要求保持不变。_NEWLINE_可变引用（mutable reference）的子类型化类似于函数参数与返回值的处理。只写引用是逆变的；只读引用是协变的；可变引用是不变的。
_START_SECTION_
类型强制
_START_PARAGRAPH_
在强制子类型化系统（coercive subtyping system），子类型通过从子类型到超类型的隐式类型转换函数得以定义。对于每个子类型关系(S <: T)，一个强制关系coerce: S → T，使得任何对象s 为类型S，可以视作对象coerceS → T(s)具有类型T。类型强制函数可以复合：如果S <: T且T <: U，难么s 可以看作类型u在复合强制关系(coerceT → U ∘ coerceS → T)。类型到其自身的coerceT → T是同一函数idT