在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 回答
您的示例中的
C
实现为Car
,而不是HatchbackSaloon
.看起来像
def lowerTypeBound(c: Car): Car
的函数可以接受HatchbackSaloon
类型的参数,这并不奇怪,对吧?尝试这样的事情:
这将无法编译,因为它需要
C
为HatchbackSaloon
,这不是Car
的超类 . 但这会奏效:因为
C
在这里是MotorVehicle
,这是允许的 .