Animale è:
interface Animale<C extends Cibo>
La variabile tigre è Animale<Erbivoro> e con questa parametrizzazione concreta, il C viene fissato a Erbivoro, quindi da un oggetto che è visto come un Animale<Erbivoro> ci si aspetta che abbia un mangia(Erbivoro).
Difatti Carnivoro che è proprio Animale<Erbivoro> ridefinisce concretamente il mangia(Erbivoro).
Invocando tigre.mangia( ..... ) puoi passare qualunque cosa che è-un Erbivoro. Non puoi passare una variabile di tipo Animale<QualunqueCibo> perché Erbivoro<QualunqueCibo> è-un Animale<QualunqueCibo> ..... ma il contrario no!
P.S. lo scenario che è descritto con quelle classi/interfacce di esempio ammetto che è un pochino contorto. Se vuoi esempi più lineari con i generics, te ne posso anche fare!![]()


Rispondi quotando