Visualizzazione dei risultati da 1 a 10 su 18

Discussione: Parametri covarianti

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Ho compreso un po' meglio quell'esempio però avrei una domanda. In realtà si ricollega al discorso del polimorfismo per dati fatto nell'altra discussione ma visto che parliamo di questo specifico esempio la faccio qui.

    Abbiamo detto che la classe di test corretta è questa:
    codice:
    public class TestAnimali
    {
        public static void main(String args[])
        { 
             Animale<Erbivoro> tigre = new Carnivoro();
             Erbivoro<Erba> erbivoro = new Erbivoro<Erba>();
             tigre.mangia(erbivoro);
        } 
    }
    Nella prima riga del main viene dichiarata una variabile reference di tipo Animale a cui poi viene assegnato l'oggetto Carnivoro istanziato.
    Questa riga mette in evidenza il polimorfismo e viene invocato, nella terza riga, il metodo mangia dell'oggetto istanziato (e non quello di Animale).
    La mia domanda è: se è vero quello che ho appena detto perchè nella seconda riga viene creata una variabile reference di tipo Erbivoro e non di tipo Animale? Provo a rispondere. Perchè in quel caso la variabile reference serve solo per essere passata in input al metodo mangia?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da newutente Visualizza il messaggio
    La mia domanda è: se è vero quello che ho appena detto perchè nella seconda riga viene creata una variabile reference di tipo Erbivoro e non di tipo Animale? Provo a rispondere. Perchè in quel caso la variabile reference serve solo per essere passata in input al metodo mangia?
    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!
    Ultima modifica di andbin; 26-11-2014 a 15:23
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    Messaggi
    315
    Quote Originariamente inviata da andbin Visualizza il messaggio
    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!
    se non ti è di troppo disturbo te ne sarei grato.
    anche perchè concettualmente direi che mi sono chiari questi concetti ma ho bisogno forse di esempi più lineari per fissarli meglio.
    Ultima modifica di newutente; 26-11-2014 a 15:39

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.