协变就是如果A是B的子类,则X<A>就是说X<B>的子类
逆变就是如果A是B的子类,反而Y<A>成为了Y<B>的父类
上面的定义非常抽象,说一个具体的例子吧,就拿猫来说,按照我们平时的逻辑,猫是动物,也就是说猫是动物的子类,当你说你想养动物的时候,养了猫就算是实现了愿望,而当你说你想养猫的时候,你养了一只动物并不能确定你的愿望是否实现。
这个就是一个设计原则的思想,叫做里式替换原则,子类可以代替父类,因为子类继承了父类已有的东西,子类还实现了父类没有实现的内容,甚至子类还可以拥有自己的想法,修改父类的东西,简直就是把父类拍在了沙滩上。
言归正传,那就继续用猫来解释一下协变,正常世界里,猫是动物的子类,上面已经讨论过了。在我家里,猫也是动物,也就是说我家的猫是我家的动物,将猫套上了我家这个外壳,猫和动物的关系依旧没有改变,这个就是协变。
讨论完协变在来讨论逆变,这个就有些变态了,而且需要好好思考一下,还继续用猫来解释,有两家兽医院,一家是猫医院(专门治猫),一家是动物医院(专门治动物),当你家猫生病了,两家医院都能去,但是当你家狗生病了,却只能去动物医院,从这点来看,动物医院可以代替猫医院,动物医院不仅有了猫医院治猫的方法,还拥有自己治疗其他动物的方法,从这点来看,动物医院是猫医院的子类,猫本来是动物的子类,但是套上了医院的外壳,猫医院倒反天罡逆转成为动物医院的父类,这个就是逆变。
但是,并不是套上外壳就必须不是逆变就是协变,比如埃及的猫,在埃及就是埃及的神,套上了埃及之后,埃及的猫和埃及的动物就是两个完全没有关系的对象,这个就叫做不转化,而逆变和协变就是转化,什么转化?当然是继承转化啦。
好了,讨论了一大推什么是协变什么逆变,那为什么要有协变逆变呢?我们下一节再继续讨论。