协变与逆变
Updated:
介绍
- 简单的说,协变是用一个窄类型替换宽类型,而逆变则是用宽类型覆盖窄类型
返回值协变
1 | class Base{ |
子类的doSomething方法返回值的类型比父类方法更窄,此时doSomething方法就是一个协变方法,同时根据java的覆写定义来看,这又属于覆写。
参数的逆变
1 | class Base{ |
子类的doSomething方法的参数类型比父类要宽,此时是一个逆变方法,子类扩大了父类的方法输入参数,同时根据java重载的定义,这又属于重载。
类型转换
1 | public static void main(String[] args){ |
base变量发生了协变,base变量是Base类型,他是父类,而其赋值却是子类实例,也就是用窄类型覆盖了宽类型。 同时根据多态的定义,这又属于多态。
数组支持协变,不支持逆变
Number[]类型可以成功转换为Integer[]类型
表面类型为Number[],实际类型为Integer[],用窄类型(Integer[])替换了宽类型(Number[]),属于协变
泛型不支持协变与逆变,但可以模拟协变与逆变
例如:
1 | List<Number> list = new ArrayList<Integer>(); |