С учетом бульдога:
trait Animal {
type Food
def defaultFood(): Food
}
class Bulldog extends Animal {
type Food = Steak
... implementations ...
}
Функция Bulldog.defaultFood()
прекрасно работает для компилятора (хотя моя подсветка синтаксиса выдала ошибку, в этом нет ничего страшного):
val bulldog = new Bulldog()
val df: bulldog.Food = bulldog.defaultFood()
Однако, если бульдог заключен внутри другого класса, все вырвется наружу:
class Kennel(val animal: Animal) {
}
def getSupply(kennel: Kennel): kennel.animal.Food = {
... implementation ...
}
val kennel = new Kennel(bulldog)
val df2: bulldog.Food = getSupply(kennel)
Компилятор Scala выдаст ошибку компиляции:
type mismatch;
found : Option[kennel.animal.V] where val kennel: Kennel
required: bulldog.Food
Эта функция в настоящее время отсутствует в Scala? Есть ли способ заставить его работать?
defaultFood()
, который возвращает экземпляр другого трейта,Food
? И почему важно, чтобыKennel
иgetSupply()
были общими, когда передаваемые параметры обязательно будут реализацией трейта (если, конечно,Animal
задан как тип параметра)? 28.02.2017df2
типаSteak
, который является не просто едой, а любимой едой бульдога. Точно так же, если вы говорите, что параметр имеет типAnimal
, вы знаете, что переданный параметр будет его реализацией, но вы не знаете, какой именно. Вы теряете различие между разными животными. ИспользуяA <: Animal
, вы можете обратиться к точномуA
, который использовался. Таким образом, питомник не только содержит какой-то тип животного, но и знает, какой именно тип животного (в нашем примереBulldog
). 28.02.2017A
позже (что мы и сделали; мы повторно использовали его для определения типа животного), у нас не было бы никакой выгоды от записи типа параметра какA <: Animal
. Благодаря полиморфизму подтипов из ООП, мы всегда можем передать этому методу любой конкретныйAnimal
(бульдог, носорог, курица). Но если мы хотим захватить этот тип и использовать его впоследствии, мы делаем это следующим образом. В Java тоже есть похожие приемы, только менее гибкие (особенно когда вы включаете в историю вариативность). 28.02.2017