stavo leggendo la sezione 20.7 della Programmazione libro in Scala e mi chiedevo perché mentre questo codice viene compilato:tipi Scala: Classe A non è uguale al T dove T è: tipo 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)
questo codice non (il resto del codice è la stessa di prima, solo le ultime modifiche di linea):
bessy eat (new Grass)
E per quanto mi pare di capire il tipo di erba è la stessa di Cow.SuitableFood.
Inoltre, ho un'altra domanda per quanto riguarda questo esempio:
Se Bessy è di tipo animale, come può il compilatore sa che ha bisogno di un tipo SuitableFood -> Erba, invece di un tipo di cibo? Perche' cercando di fornire un nuovo alimento mi dà un errore di compilazione di tipo non corrispondente, ma l'animale di classe ha bisogno di un tipo di alimentazione e il tipo di Bessy è esplicitamente definito: Animal
Suggerimento: aggiungere il tag _path-dependent-type_ a questa domanda. Questo potrebbe attirare una risposta da qualcuno che sa più esattamente di questo tipo di difficoltà. (Sto ancora lottando con i tipi dipendenti da path.) –
@BenKovitz Aggiunto, grazie. – vicaba