解释: PECS 《Effective Java》的描述:producer-extends, consumer-super(PECS)。
A为B的子类,记为A ≦ B ,f(A) 暂且理解为由A构造出来的类型,下面为协变、逆变定义
当A ≦ B时,如果有f(A) ≦ f(B),那么f叫做协变;
当A ≦ B时,如果有f(B) ≦ f(A),那么f叫做逆变;
如果上面两种关系都不成立则叫做不可变。
基本概念理解,下面举个例子:
java 泛型无逆变、协变,称为不变,举例:
String 为Object子类 可以记为 String ≦ Object
但是:List<String> ls = new ArrayList<String>();
List<Object> t =ls; //Type mismatch: cannot convert from List<String> to List<Object>
即:f(String) 不是 f(Object) 子类
但可以引入引入通配符获取类似效果
List<String> ls = new ArrayList<String>();
List<? extends Object> lo =ls; //协变
List<Object> obj_list = new ArrayList<Object>();
List<? super String> obj_s = obj_list; //逆变
数组具有协变
String 为A String[] 为f(A)
String[] sts = {"1","2"};
Object[] objs = sts;