Scala上下界交集[A >: Bicycle <: Vehicle]的类型匹配疑问
理清Scala上下界结合使用的逻辑
嘿,我能理解你的困惑——一开始很容易把上下界的约束和传入实例的类型直接绑定起来,其实这里的核心是类型参数的推断规则和Liskov替换原则的结合,我来一步步给你拆解:
首先,先明确你定义的Parking[A >: Bicycle <: Vehicle]中上下界的真实含义:
A <: Vehicle:类型参数A必须是Vehicle的子类型(包括Vehicle自身),也就是说A可以是Vehicle、Car、Jeep、Coupe、Motorcycle、Bicycle、Tricycle中的任意一个。A >: Bicycle:类型参数A必须是Bicycle的超类型(包括Bicycle自身),也就是说A可以是Bicycle、Vehicle、Thing。
但两个约束叠加后,A的有效范围是两个集合的交集:也就是Bicycle和Vehicle——这部分你的初始推断是对的,但问题出在:你传入的实例类型不需要等于A,只需要是A的子类型即可。
接下来分析你遇到的两个场景:
场景1:new Parking(new Tricycle)
当你传入Tricycle实例时,Scala会自动推断A为Bicycle(因为Bicycle满足上下界约束)。而Tricycle是Bicycle的子类型,根据Liskov替换原则,子类型实例可以赋值给超类型的变量,所以plaza: Bicycle完全能接受Tricycle实例,自然可以正常运行。
场景2:new Parking(new Coupe)
当你传入Coupe实例时,Scala会推断A为Vehicle(Vehicle满足A >: Bicycle和A <: Vehicle的双重约束)。而Coupe是Vehicle的子类型,同样符合Liskov原则,plaza: Vehicle可以接受Coupe实例,所以也能成功运行。
简单总结一下:上下界限制的是类型参数A的可选范围,但你传入的实例只需要是某个符合约束的A的子类型就行,而不是必须让实例类型直接等于A。这就是为什么你看起来“超出”初始推断的实例也能正常工作的原因。
内容的提问来源于stack exchange,提问作者Animesh Srivastava
相关产品推荐
相关产品推荐

