Tipos de Scala: Classe A não é igual a T, onde T é: tipo T = A

Eu estava lendo a seção 20.7 do livro Programming in Scala e queria saber por que, enquanto esse código compila:

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)

Esse código não (o restante do código é o mesmo de antes, apenas a última linha é alterada):

bessy eat (new Grass)

E, tanto quanto eu entendo, o tipo de grama é o mesmo de Cow.SuitableFood.

Além disso, tenho outra pergunta sobre este exemplo:

Se bessy é do tipo Animal, como o compilador pode saber que precisa de um tipo de alimento adequado -> grama, em vez de um tipo de alimento? Porque tentar fornecer um novo alimento gera um erro de compilação de incompatibilidade de tipo, mas a classe Animal precisa de um tipo de alimento e o tipo de bessy é explicitamente definido: Animal

questionAnswers(3)

yourAnswerToTheQuestion