编程语言的类型框架中,协变和逆变是指宽类型和窄类型在某种情况下(如参数、泛型、返回值)替换或交换的特性。 简单地说,协变是用一个窄类型替换宽类型,而逆变则是用宽类型覆盖窄类型。
在java中可以这样去理解: Java中String类型是继承自Object的,姑且记做String ≦ Object,表示String是Object的子类型,String的对象可以赋给Object的对象。而Object的数组类型Object[],理解成是由Object构造出来的一种新的类型,可以认为是一种构造类型,记f(Object),那么可以这么来描述协变和逆变: 当A ≦ B时,如果有f(A) ≦ f(B),那么f叫做协变; 当A ≦ B时,如果有f(B) ≦ f(A),那么f叫做逆变; 如果上面两种关系都不成立则叫做不可变。