首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >协方差的Scala编译器行为

协方差的Scala编译器行为
EN

Stack Overflow用户
提问于 2020-10-06 10:05:01
回答 1查看 44关注 0票数 0

以下代码运行良好:

代码语言:javascript
复制
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,否则不能编译(这是预期的)。

代码语言:javascript
复制
parkMyVehicle(Parking[Car](Car("Mercedes")))

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 10:21:35

因为推断可以从上下文中确定应该是什么类型。也就是说。

代码语言:javascript
复制
parkMyVehicle(Parking(Car("Mercedes")))
//            ^ ---------------------^ What's the type of that?

由于parkMyVehicle采用Parking[Vehicle],所以这种类型应该来自编译器PoV。因此,该表达式将被键入一个向上转换到超类:

代码语言:javascript
复制
parkMyVehicle(Parking[Vehicle](Car("Mercedes"): Vehicle))

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

代码语言:javascript
复制
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
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64223601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档