Scala Bounds Intersection

时间:2018-05-27 10:12:06

标签: scala types bounded-types

我已经了解了Scala中的下限和上限。 我知道如何单独处理它们但如果我们把它们放在一起会发生什么,比如说A >: B <: C 我的问题是基于这个问题:

trait Thing
class Vehicle extends Thing
class Car extends Vehicle
class Jeep extends Car
class Coupe extends Car
class Motorcycle extends Vehicle
class Bicycle extends Vehicle
class Tricycle extends Bicycle

并假设我们宣布

class Parking[A >: Bicycle <: Vehicle](val plaza: A)

所以从A>: Bicycle我们可以推断A可以有类型Bicycle,Vehicle和Thing 从A<: Vehicle我们可以推断出A可以有除Thing之外的任何类型

所以从上面的陈述我们可以通过使用数学交叉属性来推断A只能有自行车,车辆和东西的类型吗? 根据Liskov的原则

,我觉得这很有效
new Parking(new Tricycle)

但为什么以下也有效?

new Parking(new Coupe)

我是新手,所以请引导我而不是标记更多重复并关闭它。

1 个答案:

答案 0 :(得分:2)

不,这不会引发错误。

new Tricycle可以是[{1}},TricycleBicycleVehicleThingAnyRef类型。

Any无法编译,但new Parking[Tricycle](new Tricycle)new Parking[Vehicle](new Tricycle)可以。

new Parking[Bicycle](new Tricycle) new Parking(new Tricycle)中推断为A,因此不会引发错误。

Bicycle可以是[{1}},new CoupeCoupeCarVehicleThing类型。其中AnyRef解决了不平等问题Any