Я думаю, ты путаешь смысл определения type T <: Fruit
: Это абстрактного типа Defintion (в отличии от type T = Fruit
который является типом псевдонимом). Абсолютные типы не создают класс T, который расширяет Fruit
, скорее это абстрактная декларация , которая должна быть переопределена в каком-либо подклассе, который будет использоваться.
От Learning Scala, chapter 10:
... абстрактные типы спецификаций, которые могут решить к нулю, один или много классов. Они работают таким же образом к типу псевдонимов, но являются спецификации они абстрактны и не могут быть использованы для создания экземпляров
Обратите внимание, что декларация type T <: Fruit
может находиться только в классе/признаке (не является объектом, ни TOP- определения уровня), потому что это бессмысленно до тех пор, пока этот класс/признак не будет расширен. Где он определен, он все еще абстрактный, и поэтому компилятор не может точно знать, что Apple
расширяет его.
Пример использования такого определения:
trait Price {
type T <: Fruit
def printPrice(x: T): Unit
}
class ApplePrice extends Price {
override type T = Apple
override def printPrice(x: Apple): Unit = ???
}
Здесь ApplePrice
должны переопределить этот абстрактный тип с чем-то. Другой подкласс Price
может переопределить это что-то другое (например, Banana extends Fruit
), который должен дать понять, что выражение val t: T = Apple("apple")
помещается в Price
не может скомпилировать - для некоторых возможного простирающегося класса, T
не Apple
, а также не Apple
расширить T
.
Итак, 'Pear <: Fetus' означает, что груша - это некоторый ** конкретный ** подтип' Fetus' и что ** конкретный ** подтип не 'Apple' ?? Но почему «Груша» не может быть «Apple»? Весь компилятор знает, что 'Pear' является подтипом' Fetus'. Это может быть или не быть Apple. – Samar
Я обновил ответ –
Спасибо за ваш ответ, теперь это имеет смысл. – Samar