Visualizzazione dei risultati da 1 a 10 su 13

Discussione: Downcasting di oggetti

Visualizzazione discussione

  1. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Gas75 Visualizza il messaggio
    L'obiettivo dell'esercizio sarebbe quello di invocare il metodo di una sottoclasse da un oggetto che è stato upcastato (che funziona) e viceversa, cioè invocare il metodo di una superclasse da un oggetto che è stato downcastato, ma pare che quest'ultimo passaggio non sia possibile per come viene costruito superclasse, che nasce già come Sottoclasse e col downcasting gli tolgo delle specificità ma ciò che era overriden e persiste nell'oggetto resta tale.
    Ok, vediamo di chiarire la questione perché secondo me non ce l'hai ancora molto chiara. Usiamo uno scenario reale/sensato.

    codice:
    public class Persona {
        // .....
    }
    
    public class Studente extends Persona {
        // .....
    }
    
    public class Impiegato extends Persona {
        // .....
    }

    Non ho messo nulla nelle classi, perché ai fini del discorso non importa molto.

    A livello di tipi reference una conversione da un sottotipo ad un supertipo non causa mai alcun problema, non implica alcun controllo a runtime (perché il compilatore "sa" già che è corretto) e può sempre essere implicito. Se vuoi esplicitare la conversione con un "up" cast, è lecito ma superfluo.

    codice:
    Studente s = new Studente();
    Persona p1 = s;             // conversione implicita
    Persona p2 = (Persona) s;   // conversione esplicita, lecita ma superflua

    Un Studente è-un Persona, relazione IS-A come si dice in inglese nella OOP. Quindi un riferimento ad un Studente può essere lecitamente passato ovunque sia richiesto un Persona. Non c'è bisogno di un "up" cast esplicito (sebbene non fa alcun male).

    Ora vediamo il contrario.

    codice:
    Persona p = new Studente();
    Studente s = (Studente) p;

    Qui il "down" cast è obbligatorio, questa è una conversione controllata a runtime. Per il compilatore il cast è lecito perchè "è possibile" che una variabile di tipo Persona faccia riferimento ad un oggetto di tipo Studente. Ma il compilatore "non sa" cosa succede a runtime. Quindi è la JVM che deve controllare a runtime in quel punto che l'oggetto referenziato da p sia DAVVERO un Studente.
    Se lo è (e sopra è così), allora la conversione ha successo e tu puoi ri-vedere l'oggetto come Studente.

    codice:
    Persona p = new Impiegato();   // Un Impiegato !!!
    Studente s = (Studente) p;     // FALLISCE con ClassCastException

    Anche qui il cast è di nuovo lecito per il compilatore. Ma la conversione è di nuovo controllata a runtime. L'oggetto referenziato da p è davvero un Studente?? NO!!! Ora p fa riferimento ad un oggetto Impiegato (lecito perché Impiegato è-un Persona).
    Quindi il cast fallisce e a RUNTIME (NON in compilazione!) con un bel ClassCastException.
    Ultima modifica di andbin; 06-07-2017 a 11:08
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.