共变和反变(计算机科学)
编辑许多编程语言类型系统支持子类型化。差异是指更复杂的类型之间的子类型与它们的组成部分之间的子类型的关系。根据类型构造函数的不同,简单类型的子类型关系可能会被保留、颠倒,或者被相应的复杂类型所忽略。这意味着简单类型的子类型关系在复杂类型中得到了保留。这里,简单类型的子类型关系对于复杂类型来说是相反的。换句话说,协变性是通过更具体而不同的质量(Cat对Animal是协变的),而禁变性是通过更一般而不同的质量(Animal对Cat是禁变的)。一个编程语言的设计者在为诸如数组、继承和通用数据类型等语言特征设计类型规则时,会考虑差异性。通过使类型构造器具有协变性或禁变性而不是不变性,更多的程序将被接受为类型良好。另一方面,程序员经常会发现禁忌变量不直观,而且准确地跟踪变量以避免运行时的类型错误会导致复杂的类型化规则。
正式定义
编辑在编程语言的类型系统中,一个类型规则或一个类型构造函数是。如果它保留了类型的排序(≤),将类型从更具体的排序到更通用的排序:如果A≤B,那么I<A>≤I<B>;如果它颠倒了这个排序,则是不变量。如果A≤B,那么I<B>≤I<A>;如果这两种情况都适用(即,如果A≤B,那么I<A>≡I<B>),则是双变量;如果是协变、禁变或双变量,则是变体;如果不是变体,则是不变体或非变体。文章考虑了这如何适用于一些常见的类型构造函数。
C#例子
编辑C#通用接口的变量是通过在其类型参数(零个或多个)上放置out(不变)或in(不变)属性来声明的。对于每个如此标记的类型参数,编译器会最终验证这种使用是全局一致的。
共变和反变(计算机科学)的数组
编辑只读的数据类型(源)可以是共变的;只写的数据类型(汇)可以是禁变的。同时作为源和汇的可变数据类型应该是不变的。为了说明这一普遍现象,考虑一下数组类型。对于动物类型,我们可以做一个类型Animal[],它是一个动物数组。
内容由匿名用户提供,本内容不代表vibaike.com立场,内容投诉举报请联系vibaike.com客服。如若转载,请注明出处:https://vibaike.com/170701/