Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Programmino che non si compila

    Salve. Non riesco a capire perché questo semplice programma non viene compilato.
    codice:
    class Animale {  
      public void padrone() throws Exception {
        System.out.println("Ho un animale");
      }
    }
    public class Cane extends Animale {
      public void padrone() {
        System.out.println("Ho un cane");
      }
      public static void main(String[] args) {
        Animale g = new Cane();
        g.padrone();
      }
    }
    Nell'override di un metodo che prevede eccezioni, posso prevedere eccezioni uguali al metodo iniziale o appartenenti a una sua sottoclasse di eccezioni ivi inclusa l'assenza di eccezioni, quindi dovrebbe andare bene e stamparmi "Ho un cane".
    Dove l'inghippo?

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Nell'override di un metodo che prevede eccezioni, posso prevedere eccezioni uguali al metodo iniziale o appartenenti a una sua sottoclasse di eccezioni ivi inclusa l'assenza di eccezioni, quindi dovrebbe andare bene e stamparmi "Ho un cane".
    Dove l'inghippo?
    Una delle regole del overriding dice che il metodo che sta facendo l'override (padrone() di Cane nel tuo caso) può dichiarare meno eccezioni o eccezioni più "ristrette". NON può dichiarare eccezioni nuove o più "ampie".

    Nel tuo caso padrone() di Cane non dichiara throws Exception, insomma descrive che ha meno "rischi" (rispetto al padrone() di Animale) sul fronte delle eccezioni. E questo appunto è lecito.

    Il punto è che nel main il padrone() l'hai invocato su una variabile reference di tipo Animale. Il compilatore si basa solo su questo: Animale ha un padrone() che dichiara Exception, quindi tu che chiami questo metodo su un Animale, siccome Exception è "checked" allora devi considerare questo rischio e quindi trattare in qualche modo l'eccezione. Cosa che invece ora non stai facendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  3. #3
    Quindi essenzialmente devo stare attento nel fare override se uso una dichiarazione tipo
    codice:
    Animale g = new Cane();
    perché quest'ultima istruzione comanda rispetto alle libertà che posso prendermi nell'override di un metodo con eccezioni.

    Non è molto intuibile ma credo di aver inteso il concetto.
    Grazie.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    Quindi essenzialmente devo stare attento nel fare override se uso una dichiarazione tipo
    codice:
    Animale g = new Cane();
    perché quest'ultima istruzione comanda rispetto alle libertà che posso prendermi nell'override di un metodo con eccezioni.

    Non è molto intuibile ma credo di aver inteso il concetto.
    Grazie.
    Supponi che in padrone() di Animale ci sia throws IOException e immagina per un attimo (non è così infatti in realtà) che il linguaggio permetta a padrone() di Cane di avere throws Exception (che è più "ampia" di IOException).

    Visto che deve valere il principio di sostituibilità, se tu hai un reference di tipo Animale, potrebbe referenziare qualunque oggetto che è esattamente Animale (è istanziabile infatti) o sottotipo (Cane o altro).
    Se tu invochi padrone() su un Animale, il compilatore "sa" solo di IOException e tu non potresti sapere che un sottotipo dichiara qualcosa di più ampio. Insomma NON saresti preparato a gestire Exception.

    Questo è il motivo per cui un metodo che fa l'override NON può causare più "rischi" rispetto al metodo nel supertipo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  5. #5

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.