类型变化关系(1)
1、面向对象语言,支持子类型(Subtyping)
2、类型变化关系(type variance)
-更复杂类型中的子类型关系,与子类型之间的关系相关联
A,B是类型,f()表示类型转换,?表示继承,如A?B表示A继承于B
如果A?B,有f(A)?f(B)f()是协变(convariant)
如果A?B,有f(B)?f(A),f()是逆变(contravariant)
当上述两种都不成立,即f(A)和f(B)都没有关系,f()是不变(invariant)
如果A?B,有f(A)?f(B)和f(B)?f(A),f()是双变(bivariant)
Java数据类型变化(1)
1、Java数组是协变的
-String是Object的子类,String[]是Object[]的子类
2、Java的泛型是不变的
-String是Object的子类,List和List没有关系
-泛型可采用通配符,支持协变和逆变
ArrayList<?extends A>list3 = new ArrayList();//协变
ArrayList<?super B> list4 = new ArrayList;//逆变
JDK1.5以上的重写方法,参数要求一样的,返回值是协变的