首页 文章

Scala降低了对方法参数的限制'is a subtype'限制

提问于
浏览
3

在Scala中,为什么在方法类型参数上设置较低的类型边界不会对方法争论强制执行“超类型”限制?

object TypeBounds extends App {
  class MotorVehicle
  class Truck extends MotorVehicle
  class Car extends MotorVehicle
  class Saloon extends Car
  class HatchBackSaloon extends Saloon

  def lowerTypeBound[C >: Car](c: C): C = c

  def upperTypeBound[C <: Car](c: C): C = c

  // Works. HatchBackSaloon is a sub class of Car
  println(upperTypeBound(new HatchBackSaloon())) 

  // as expected doesn't compile. Truck is not a subclass of Car    
  println(upperTypeBound( new Truck()))  

  // Compiles and runs, but why ?  HatchBackSaloon is not a super class of Car.
  println(lowerTypeBound(new HatchBackSaloon())) 

}

1 回答

  • 6

    您的示例中的 C 实现为 Car ,而不是 HatchbackSaloon .

    看起来像 def lowerTypeBound(c: Car): Car 的函数可以接受 HatchbackSaloon 类型的参数,这并不奇怪,对吧?

    尝试这样的事情:

    val result: HatchBackSaloon = lowerTypeBound(new HatchBackSaloon)
    

    这将无法编译,因为它需要 CHatchbackSaloon ,这不是 Car 的超类 . 但这会奏效:

    val result: MotorVehicle = lowerTypeBound(new HatchbackSaloon)
    

    因为 C 在这里是 MotorVehicle ,这是允许的 .

相关问题