繁体   English   中英

Scala 中的逆变用法

[英]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 因为可以存储任何ABox可以存储B
但是,只能存储BBox不能存储任意A

看起来这不是它的工作方式,而是从概念的角度来看: BA ,但反之则不然。

scala doc for variances所示,逆变类型参数允许传递“超类型”而不是“子类型”,但这适用于正文中使用的内容(例如,如果“超类型”已经已经定义了使用的内容)否则我猜它只是考虑类型,我们回到我之前解释的内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM