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