Scala Bounds Intersection - PullRequest
0 голосов
/ 27 мая 2018

Я узнал о нижней и верхней границах в 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может иметь только типы Bicycle, Vehicle и Thing с помощью свойства математического пересечения?Так что я нашел, что это работает, согласно принципу Лискова

new Parking(new Tricycle)

, но почему следующее также работает?

new Parking(new Coupe)

Я новичок в этом, поэтому, пожалуйста, помогите мне, а не отмечайте большедублируйте и закрывайте это.

1 Ответ

0 голосов
/ 27 мая 2018

Нет, это не приведет к ошибке.

new Tricycle может быть типа Tricycle, Bicycle, Vehicle, Thing, AnyRef, Any.

new Parking[Tricycle](new Tricycle) не компилируется, но new Parking[Vehicle](new Tricycle), new Parking[Bicycle](new Tricycle) do.

In new Parking(new Tricycle) A подразумевается как Bicycle, поэтому он не выбрасываетошибка.


new Coupe может быть типов Coupe, Car, Vehicle, Thing, AnyRef, Any.Среди них это Vehicle, которое решает неравенство A >: Bicycle <: Vehicle.

...