今天,我深入探讨了Liskov的替代原理和协方差/反方差。
我被困在了以下两个区别上:
T = TypeVar("T", bound=Union[A, B])T = TypeVar("T", A, B, covariant=True)我对#1的理解
TypeVar('T',A,B)与TypeVar('T',bound=Union[A,B])的差异
这个答案明确指出,T可以是:
Union[A, B] (或A和B的任何子类型(如Union[A, BChild])的联合)A (或A的任何子类型)B (或B的任何子类型)这对我来说很有道理。
My 对#2的理解
MyPy不允许受约束的TypeVar是协变的吗?定义具有约束但协变键-val类型的泛型dict
再次提到bound=Union[A, B]的情况,但没有得到选项2,A, B, covariant=True的意义.
我试着和mypy玩过,但似乎搞不懂。,有人能指出这意味着什么吗?
我认为这意味着:
A (或A的任何子类型)B (或B的任何子类型)(也就是从上面排除了Union案件)
**编辑**
评论中提出了以下问题:
你确定他们真的不同吗?
下面是示例代码,以显示差异。这些错误来自于mypy==0.770。
from typing import Union, TypeVar, Generic
class A: pass
class ASub(A): pass
class B: pass
# Case 1... Success: no issues found
# T = TypeVar("T", bound=Union[A, B])
# Case 2... error: Value of type variable "T" of "SomeGeneric" cannot be "ASub"
T = TypeVar("T", A, B, covariant=True)
class SomeGeneric(Generic[T]): pass
class SomeGenericASub(SomeGeneric[ASub]): pass**编辑2**
最后我在( co",A,B,covariant=True)并通过A的子类上问了这个问题
这澄清了我的一些误解。事实证明,TypeVar("T", A, B, covariant=True)并不是真的正确,因为知道A和B的值限制实际上并不是协变量的。
covariant=True语法的使用只有在相关时才有帮助。
发布于 2020-05-11 19:38:30
协方差和对方差是与面向对象和泛型的交集相关的术语.
以下是这个概念试图回答的问题:
Base和Derived。List<T>。Derived可以在任何地方使用--这是否意味着List<Derived>可以在List<Base>可以使用的任何地方使用?List<Base>可以在List<Derived>可以使用的任何地方使用?如果(3)的答案是肯定的,则称为协方差,我们将声明List为有covariance=True。如果(4)的答案为真,则称为contra-variance.如果不为真,则为不变。
界也来自OO和泛型的交集。当我们定义泛型类型MyType<T>时,这是否意味着T可以是任何类型?或者,我可以对什么是T施加一些限制吗?边界允许我声明,例如,T的上限是类Derived。在这种情况下,Base不能与MyType一起使用,但是Derived及其所有子类都可以。
协方差和对比方差的定义可在PEP-484的这一节中找到。
https://stackoverflow.com/questions/61568462
复制相似问题