协变 Covariance

如果T2T1的子类型,如果GenType[T2]GenType[T1]的子类型,那么称为协变

逆变 Contravariance

如果T2T1的子类型,如果GenType[T1]GenType[T2]的子类型,那么称为逆变

不变 Invariant

既不是逆变也不是协变

总结

逆变和协变是描述一种现象,对于GenType[T]可能有逆变、协变或者不变。

但是在Python中需要给T指明是协变还是逆变,这实际上是指在GenType[T]这种泛型形式中T是协变的还是逆变的,实际上是要结合整个形式。

网上误解

  1. 在传入参数的变量是逆变的,返回参数是协变的

    实际上这是在说Callable[[T],R]这种形式中T是逆变的, R是协变的,仅仅指的是Callable[[T],R]这种情况下。

  2. List[T]是协变的 List[T]是不变的,事实上,尽管List[int]的值集是List[float]的值的子集,但只有int可以附加到List[int]