讲协变和逆变的前提是: 里氏替换原则---“子类可以在程序中代替父类,并保证类型安全”。
那 啥样的子类才可以安全的表示其父类呢??
对于接口和对象来说,子类如果想安全的代表其父类 必须加更多的属性限制才行。例如 "六年级一班25岁的初中生小明" 可以代表 ”人类“ 。从抽象到具体的变化,让子类安全的表示了父类,这种越来越具体范围越来越小的变化 俺们叫它 协变!!
但是 对于函数的参数来说恰恰相反。如果一个函数要接收 "人类 " 作为入参,(所有人类能做的事情都要在这个函数中实现)!!那么 我们传什么给它才能完全满足,参数里必须包含 "人类"的要求呢,当然 传入的参数要比 "人类" 大或者和 "人类" 一样才能满足要求,因为这个函数要做所有人类能做的事情(最终决定把 '生物‘ 作为参数)。这种范围越大越安全的表示方式 俺们叫他逆变。
生活中有哪些逆变的例子呢?最典型的就是 追女朋友。假如你女朋友只要求你能陪在她身边 她以后就嫁给你。那么你该怎么做呢?就只陪在她身边吗?当然不是!!!你给的 应该比她期望的多,除了陪在她身边,你还要打工赚钱 遇事能帮她抗有责任有担当。你给的范围远远大于她的要求,这样你才安全 不会被第三者轻易插足。这种范围越大越安全的情形 就是逆变!!!
标签:看不懂,逆变,子类,协变,安全,人类,函数 From: https://www.cnblogs.com/daxiong182/p/17311668.html