Scala-Typen: Klasse A ist nicht gleich T, wobei T ist: Typ T = A

Ich habe den Abschnitt 20.7 des Buches Programmieren in Scala gelesen und mich gefragt, warum dieser Code kompiliert wurde:

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 derselbe wie zuvor, nur die letzte Zeile wird geändert):

bessy eat (new Grass)

nd soweit ich weiß, ist die Grasart die gleiche wie bei Cow.SuitableFoo

Auch habe ich eine andere Frage zu diesem Beispiel:

Wenn bessy vom Typ Animal ist, wie kann der Compiler wissen, dass er einen Typ RecommendedFood -> Grass anstelle eines Typs Food benötigt? Der Versuch, ein neues Food bereitzustellen, führt zu einem Kompilierungsfehler, bei dem der Typ nicht übereinstimmt. Die Klasse Animal benötigt jedoch einen Typ Food, und der Typ der Bessy ist explizit definiert: Animal

Antworten auf die Frage(6)

Ihre Antwort auf die Frage