【问题标题】:Scala lower type bound 'is a subtype' restriction on method argumentsScala 下限类型限制“是子类型”对方法参数的限制
【发布时间】:2016-01-07 00:27:46
【问题描述】:

在 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())) 

}

【问题讨论】:

标签: scala


【解决方案1】:

您的示例中的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,这是允许的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 2022-06-15
    • 2010-10-27
    • 2015-12-26
    • 2015-10-15
    • 1970-01-01
    • 2019-12-22
    相关资源
    最近更新 更多