定义
逆变与协变用来描述类型转换(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)相互之间没有继承关系。
通配符
Java数组是协变的,泛型是不变的。可有时需要实现协变,在两个类型之间建立某种类型的向上转型关系时,采用通配符解决。
《Effective Java》的描述:producer-extends, consumer-super(PECS)。
从数据流来看,extends是限制数据来源的(生产者),而super是限制数据流入的(消费者)。
reference: