协变和逆变:编程中的明显区别
协变和逆变是编程中的基本概念,定义类型关系如何影响函数映射和数据结构输入/输出类型。 本质上,协变保留了可分配性方向,而逆变则相反。
协方差:维持可分配性
让我们用类型集来说明:
<code>{ Animal, Tiger, Fruit, Banana } { IEnumerable<Animal>, IEnumerable<Tiger>, IEnumerable<Fruit>, IEnumerable<Banana> }</code>
映射 T → IEnumerableTiger
是 Animal
的子类型,那么 IEnumerable<Tiger>
也是 IEnumerable<Animal>
的子类型。这在容器类型中很常见,子类型适用于所包含的元素。
逆变:可逆可赋值性
现在,考虑这些类型集:
<code>{ IComparable<Tiger>, IComparable<Animal>, IComparable<Fruit>, IComparable<Banana> }</code>
映射 T → IComparableAnimal
是 Tiger
的超类型,则 IComparable<Animal>
是 IComparable<Tiger>
的子类型。 这在函数类型中经常观察到,其中逆变类型管理特定或相关类型的输入参数。
主要差异总结
协方差维护可分配性方向;子类型值可以在函数输入和输出中分配给超类型值。 相反,逆变会反转可分配性,从而可以在输入参数中将超类型值分配给子类型值,但不能在输出中进行分配。
以上是协方差与违反:这些概念在编程方面有何不同?的详细内容。更多信息请关注PHP中文网其他相关文章!