繁体   English   中英

协方差的 Scala 编译器行为

[英]Scala compiler behaviour for Covariance

以下代码运行完美:

abstract class Vehicle{
  val name:String
}
case class Car(name: String) extends Vehicle
case class Bike(name: String) extends Vehicle

case class Parking[T](vehicle: T)

object Covariance extends App {

  def parkMyVehicle(p : Parking[Vehicle]): Unit = println(s"Parking ${p.vehicle.name}")
  parkMyVehicle(Parking(Car("Mercedes")))
  parkMyVehicle(Parking(Bike("HD")))

}

这有点奇怪,因为Parking不是协变的。

但是,以下行要求协变Parking ,否则不会编译(这是预期的)。

parkMyVehicle(Parking[Car](Car("Mercedes")))

我的问题是,为什么parkMyVehicle(Parking(Car("Mercedes")))不要求协变Parking

因为推理可以从上下文中找出应该是什么类型。 IE

parkMyVehicle(Parking(Car("Mercedes")))
//            ^ ---------------------^ What's the type of that?

由于parkMyVehicle需要Parking[Vehicle] ,那么编译器parkMyVehicle的类型应该是什么。 因此,该表达式通过向上转换输入到超类:

parkMyVehicle(Parking[Vehicle](Car("Mercedes"): Vehicle))

但是,如果您提取变量,情况会有所不同:

val p = Parking(Car("Mercedes")) // Type is first figured out to be Parking[Car]
parkMyVehicle(p) // now the type of p does not match, so it fails to compile

暂无
暂无

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

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