共变,不变和反变

这三个词描绘了一个含有类型参数的类之间的子父类关系是如何随着它类型参数的变化而变化的一种性质。

够兜圈的吧。别急,举个例子就明白了。说,咱有两种箱子,一种装水果,一种装香蕉。问,如果香蕉是水果的子类,那么装香蕉的箱子也是那个装水果箱子的子类吗?

这里的箱子就是一个含有类型参数的类,而它的类型参数就是提到的水果和香蕉。

如果答案说,对,装香蕉的是装水果的箱子的子类,我们就说箱子这个类相对于它的类型参数是共变的,因为他们步调一致。如果答案说,不是,那么我们就用不变来形容上述关系。如果答案更出乎意料说,不仅不是,而且恰恰相反,装香蕉的是装水果箱子父类,我们就说,反了反了,是反变。

这一切重要吗?一方面说,重要,相当重要,因为我们先搞清了概念。一方面说不重要,因为要得到最终的答案,是共变,不变还是反变,还少了最重要的一个限制条件,少了它,谈什么都没有意义。那就是这个箱子能干啥,它有哪些可以被外界掉用的方法。因为这个条件是我们进行父子鉴定的基础。

在面相对象界,父子鉴定的理论依据是liskov替换原则,说的是,对于两个类甲和乙,如果甲能做的事乙都能做那么乙就是甲的一个子类,也就是说如果乙在任何条件下都可以替换甲,乙就是甲的子类。

所以说,得看看箱子能干什么,装香蕉的箱子能不能在任何条件下都能替换装水果的。

下一篇再举几个例子来具体感受共变,不变和反变。

王辉 wechat
交流或订阅,请长按或扫描上方微信二维码