2017-02-07 2 views
1

Ich schaue mir ein Beispiel aus Abstract Members an. Wir haben das folgende Beispiel für pfadabhängige Typen.Wegabhängige Typen und Generika

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 

sagen wir in einer Klasse in der folgenden Weise mit essen arbeiten wollen

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

ich type mismatch; expected t.SuitableFood, actual: T. Ich sehe, dass ich in das Wasser von Generika und wegabhängigen Typen eintrete. Ich würde mich über jede Hilfe freuen.

Dank

+0

'T' ist nicht vom Typ' SuitableFood', es ist ein 'Tier: ein Tier. Gibt es einen Tippfehler in 't.eat (t)'? – marstran

+0

Wie soll ich sagen, dass es vom Typ 'SuccessfulFood' ist? – zaxme

+0

Ich denke, Sie können einfach einen Typparameter zu der Funktion hinzufügen, wie folgt: 'def blah [F <: Geeignetes Essen] (t: T, Essen: F): String = t.eat (Essen)'. – marstran

Antwort

2

Wie sage ich es vom Typ SuitableFood ist?

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

Beachten Sie, dass es in einer separaten Parameterliste sein muss, auf t abzuhängen.

Der Grund def blah(t: T, food: T#SuitableFood) nicht der Fall funktioniert, weil es unter Code erlauben würde:

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

Können Sie erklären, was hier passiert? Oder weisen Sie mich auf einige Ressourcen hin! Vielen Dank! – zaxme