sou*_*ole 0 types scala type-inference 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")))
}
Run Code Online (Sandbox Code Playgroud)
这有点奇怪,因为Parking不是协变的。
但是,以下行要求 covariant Parking,否则不会编译(这是预期的)。
parkMyVehicle(Parking[Car](Car("Mercedes")))
Run Code Online (Sandbox Code Playgroud)
我的问题是,为什么parkMyVehicle(Parking(Car("Mercedes")))不要求 covariant Parking?
因为推理可以从上下文中找出应该是什么类型。IE
parkMyVehicle(Parking(Car("Mercedes")))
// ^ ---------------------^ What's the type of that?
Run Code Online (Sandbox Code Playgroud)
因为parkMyVehicle需要Parking[Vehicle],所以类型应该来自编译器 PoV。因此,该表达式通过向上转换输入到超类:
parkMyVehicle(Parking[Vehicle](Car("Mercedes"): Vehicle))
Run Code Online (Sandbox Code Playgroud)
但是,如果您提取变量,情况会有所不同:
parkMyVehicle(Parking(Car("Mercedes")))
// ^ ---------------------^ What's the type of that?
Run Code Online (Sandbox Code Playgroud)