2017-02-07 5 views
1

Я рассматриваю пример от Abstract Members. У нас есть следующий пример зависимых от пути типов.Пути-зависимые типы и генерические средства

class Food 

abstract class Animal { 
    type SuitableFood <: Food 

    def eat(food: SuitableFood): String 
} 

class DogFood extends Food 

class Dog extends Animal { 
    type SuitableFood = DogFood 

    override def eat(food: DogFood): String = food.toString 
} 

val lassie = new Dog 
lassie eat new lassie.SuitableFood 

Скажем, мы хотим работать с съедать в классе следующим образом

class D[T <: Animal] { 
    def blah(t: T, p: T): String = { 
    t.eat(t) 
    } 
} 

я получаю type mismatch; expected t.SuitableFood, actual: T. Я вижу, что я вхожу в воды дженериков и зависимых от пути типов. Буду признателен за любую помощь.

Благодаря

+0

'T' не типа' SuitableFood', это 'Animal'. Есть ли опечатка в 't.eat (t)'? – marstran

+0

Как я могу сказать, что это тип 'ApproFood'? – zaxme

+0

Я думаю, вы можете просто добавить параметр типа в функцию: 'def blah [F <: ApproFood] (t: T, food: F): String = t.eat (food)'. – marstran

ответ

2

Как я говорю, что это типа SuitableFood?

def blah(t: T)(food: t.SuitableFood) = ... 

Обратите внимание, что она должна быть в отдельном списке параметров зависит от t.

Причина def blah(t: T, food: T#SuitableFood) не работает, потому что это позволило бы ниже код:

val lassie: Animal = new Dog 
val cat: Animal = new Cat 
val catFood: Animal#SuitableFood = new cat.SuitableFood 
blah(lassie, catFood) 
+0

Можете ли вы объяснить, что здесь происходит. Или укажите мне некоторые ресурсы! Большое спасибо! – zaxme

Смежные вопросы