协变 Covariance
如果T2是T1的子类型,如果GenType[T2]是GenType[T1]的子类型,那么称为协变
逆变 Contravariance
如果T2是T1的子类型,如果GenType[T1]是GenType[T2]的子类型,那么称为逆变
不变 Invariant
既不是逆变也不是协变
总结
逆变和协变是描述一种现象,对于GenType[T]可能有逆变、协变或者不变。
但是在Python中需要给T指明是协变还是逆变,这实际上是指在GenType[T]这种泛型形式中T是协变的还是逆变的,实际上是要结合整个形式。
网上误解
-
在传入参数的变量是逆变的,返回参数是协变的
实际上这是在说
Callable[[T],R]这种形式中T是逆变的,R是协变的,仅仅指的是Callable[[T],R]这种情况下。 -
List[T]是协变的List[T]是不变的,事实上,尽管List[int]的值集是List[float]的值的子集,但只有int可以附加到List[int]