首先比较正式的解释: 逆变与协变用来描述类型转换(type transformation)后的继承关系,其定义:如果A、B表示类型,f(⋅)表示类型转换,≤表示继承关系(比如,A≤B表示A是由B派生出来的子类); - f(⋅)是逆变(contravariant)的,当A≤B时有f(B)≤f(A)成立;
- f(⋅)是协变(covariant)的,当A≤B时有f(A)≤f(B)成立;
- f(⋅)是不变(invariant)的,当A≤B时上述两个式子均不成立,即f(A)与f(B)相互之间没有继承关系。
下面在比较白话的解释: 就像 爹A,儿子B 这时候有一个泛型类,给他穿上马甲 List<A>,List<B>。那么他们是什么关系? 1.如果List<A>是爹,List<B>是儿子,那么这就是协变,我觉得这里理解为顺变比较好。 下面就要看好了。 如果我雷个去。这时候 2.List<B>变成是爹,List<A>变成了儿子,娘的反天了,这就是逆变了。应该我们所谓的逆子,不孝顺。 相信协变和逆变,应该了解了。
|