[英]Contravariance usage in Scala
根据逆变的定义(超级 class 个实例将被接受),我在下面代码片段中的最后一个陈述应该被接受; 但它被抛出类型错误。 你能纠正我的理解吗?
class A
class B extends A
class C extends B
abstract class Box[-T] {
def set(x : T) :Unit
}
val x = new Box[B] {
def set(b:B) = Console println "B"
}
val y = new Box[A] {
def set(a:A) = Console println "A"
}
val z = new Box[C] {
def set(c:C) = Console println "C"
}
x.set(new A) <-- Type error
但是x.set(new C)
很好,所以即使“逆变参数被接受为方法参数”实际上也是如此。 实际上是协变参数。
您混淆了逆变的工作原理。 x
本身就是一个Box[B] , set
接受类型B
的值(或B
的任何子类型,因为Liskvo就是这么说的) 。
但是, Box[A]是Box[B]的子类型。 所以你可以在预期x
的地方传递y
。 因为可以存储任何A
的Box可以存储B
。
但是,只能存储B
的Box不能存储任意A
。
看起来这不是它的工作方式,而是从概念的角度来看: B
是A
,但反之则不然。
如scala doc for variances所示,逆变类型参数允许传递“超类型”而不是“子类型”,但这适用于正文中使用的内容(例如,如果“超类型”已经已经定义了使用的内容)否则我猜它只是考虑类型,我们回到我之前解释的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.