Tipos de escala: la clase A no es igual a la T donde T es: tipo T = A

Estaba leyendo la sección 20.7 del libro Programación en Scala y me preguntaba por qué mientras se compila este código:

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)

Este código no lo hace (el resto del código es el mismo que antes, solo cambia la última línea):

bessy eat (new Grass)

Y hasta donde yo entiendo, el tipo de hierba es el mismo de Cow.SuitableFood.

Además, tengo otra pregunta con respecto a este ejemplo:

Si bessy es de tipo Animal, ¿cómo puede saber el compilador que necesita un tipo de comida adecuada -> hierba en lugar de un tipo de comida? Porque intentar proporcionar un nuevo Alimento me da un error de compilación de tipo no coincidente, pero la clase Animal necesita un tipo Alimento y el tipo de bessy está explícitamente definido: Animal

Respuestas a la pregunta(3)

Su respuesta a la pregunta