ich den Abschnitt 20.7 des Buches Programming in Scala zu lesen und ich habe mich gefragt, warum während dieser Code kompiliert:Scala Typen: Klasse A ist nicht gleich dem T wobei T: Typ T = A
class Food
class Fish extends Food
class Grass extends Food
abstract class Animal {
type SuitableFood <: Food
def eat(food: SuitableFood)
}
class Cow extends Animal {
type SuitableFood = Grass
override def eat(food: Grass) {}
}
val bessy: Animal = new Cow
bessy eat (new bessy.SuitableFood)
Dieser Code funktioniert nicht (der Rest des Codes ist das gleiche wie vorher, nur die letzte Zeile Änderungen):
bessy eat (new Grass)
Und soweit ich die Art von Grass verstehen ist das gleiche von Cow.SuitableFood.
Auch habe ich eine andere Frage zu diesem Beispiel:
Wenn bessy vom Typ Tier ist, wie kann der Compiler weiß, dass es eine Art SuitableFood braucht -> Grass statt eine Art Food? Weil versuchen, eine neue Nahrung zur Verfügung zu stellen, gibt mir einen Compiler-Fehler von Typ stimmt nicht überein, aber die Klasse Tier braucht eine Art Nahrung und die Art der bessy explizit definiert: Animal
Vorschlag: Fügen Sie dieser Frage das Tag _path-dependent-type_ hinzu. Das könnte eine Antwort von jemandem bekommen, der mehr über genau diese Schwierigkeit weiß. (Ich kämpfe immer noch mit pfadabhängigen Typen.) –
@BenKovitz Hinzugefügt, danke. – vicaba