提问人:Matthew Layton 提问时间:9/27/2021 更新时间:10/26/2021 访问量:373
了解一般不变性、协方差和逆变性
Understanding Generic Invariance, Covariance and Contravariance
问:
泛型的差异一直让我感到困惑。以下规则是我被引导相信的:
- 不变 T:只接受 T 的类型;仅此而已。
- 协变 T:接受 T 的类型和派生自 T 的类型,但不小于 T。
- 逆变 T:接受 T 的类型和小于 T 的类型,但不派生自 T。
鉴于以下代码示例,我猜这是错误的:
class Invariant<T>(value: T)
class Covariant<out T>(value: T)
class Contravariant<in T>(value: T)
open class A
open class B : A()
open class C : B()
class VarianceExample {
val invariantA: Invariant<B> = Invariant(A()) // Error (as expected)
val invariantB: Invariant<B> = Invariant(B()) // Okay (as expected)
val invariantC: Invariant<B> = Invariant(C()) // Okay (wait, what!?)
val covariantA: Covariant<B> = Covariant(A()) // Error (as expected)
val covariantB: Covariant<B> = Covariant(B()) // Okay (as expected)
val covariantC: Covariant<B> = Covariant(C()) // Okay (as expected)
val contravariantA: Contravariant<B> = Contravariant(A()) // Okay (as expected)
val contravariantB: Contravariant<B> = Contravariant(B()) // Okay (as expected)
val contravariantC: Contravariant<B> = Contravariant(C()) // Okay (wait, what!?)
}
特别是。。。
val invariantC: Invariant<B> = Invariant(C())
为什么允许我通过?Invariant<B>
C()
val contravariantC: Contravariant<B> = Contravariant(C())
为什么允许我通过?Contravariant<B>
C()
答: 暂无答案
下一个:与框架无关的模板引擎
评论
Invariant(C())
Invariant<B>(C())