【发布时间】:2018-01-31 14:08:55
【问题描述】:
我试图了解 逆变,它是如何工作的。考虑以下句子:
令人困惑的是,逆变意味着类型 F[B] 是 F[A] 如果 A 是 B 的子类型
这句话让我很困惑。在第一部分F[B] is subtype of F[A],突然为什么第二部分是A is a subtype of B?是自相矛盾吗?
协方差更清晰:
协方差意味着如果 B 类型 F[B] 是类型 F[A] 的子类型 是 A 的子类型。
第一部分是F[B]是子类型,第二部分也是B是子类型。
【问题讨论】:
-
就是这样。协方差是我们理解的“自然”。逆变意味着 F[B] 是 F[A] 的子类型,而 A 是 B 的子类型。 A 和 F[A] 是不同的东西,所以它并不矛盾,只是令人困惑:) 你可以检查这个答案,我认为它是很有帮助stackoverflow.com/questions/27414991/…
-
JsonWriter[Shape] is a subtype of JsonWriter[Circle] because Circle is a subtype of Shape对我来说根本没有意义。 -
逆变是协方差的“另一个方向”,另一种表述方式是
contravariance means F[B] is a subtype of F[A] if A is a supertype of B。 -
逆变真的那么令人惊讶吗?有很多相反的事情,你不会三思而后行。例如,负数的值和绝对大小是逆变的:值越大,大小越小,反之亦然。
标签: scala contravariance