协变和逆变

1.前言

根据维基百科的定义,协变与逆变是在计算机科学中,描述具有父/子型别关系的多个型别通过型别构造器、构造出的多个复杂型别之间是否有父/子型别关系的用语。

初次看定义一定是一头雾水,不知道协变逆变的具体规则与实现是什么,下面我将会通过几个例子来解释什么叫做协变,什么叫做逆变。

2.协变逆变的简单认知

有字面解释来看,协变可以解释为和谐的变化,而逆变可以解释为逆反的变化,可以看出二者是相对应的关系。协变、逆变这一对关系首先出现在数学、物理领域,所以下面我将从数学的角度提供一个示例来解释协变与逆变。

在数学中可以使用比较符号 > 来比较两个数字的大小,比如 3 > 2 是始终成立的,假设存在两个变量 x 和 y 来存储两个数值,现在定义一个 Double 方法 (x) => ( x * 2 ) (简化为Lambda表达式),可以很容易的得到以下推导式:

x > y => Double(x) > Double(y)

以上推导式是始终成立的,在推导式的左右两侧,比较符始终为 > 符号,这种比较符不变的投影就可以看作是协变的,它保留了之前的次序关系;

再定义一个 Negative 方法 (x) => ( -x ),可以得到以下推导式:

x > y => Negative(x) < Negative(y)

以上推导式也是始终成立的,但是在推导式的右侧比较符变为了 < 符号,这种比较符变为相反的投影可以看作是逆变的,它反转了之前的次序关系;

 现在,再定义一个 Squared 方法 (x) => ( x * x ),以下推导式并不是始终成立的:

x > y => Squared(x) > Squared(y)
or
x < y => Squared(x) < Squared(y)

当 x = 0, y = -1 时,其比较符反转,而当 x = 1, y = 2 时,其比较符不变,在这种情况下这种投影可以看作是不变的,它无法保证是否反转次序。

猜你喜欢

转载自www.cnblogs.com/jizhiqiliao/p/9837735.html