Upcasting e downcasting
Non ho capito cosa sono.
So che l'upcasting va da un sottotipo ad un sopratipo mentre il downcasting è l'opposto ma a cosa servono?
Grazie
So che l'upcasting va da un sottotipo ad un sopratipo mentre il downcasting è l'opposto ma a cosa servono?
Grazie
Risposte
Salve,
ci riferiamo alla programmazione in java, o no?
Cordiali saluti
ci riferiamo alla programmazione in java, o no?
Cordiali saluti
Si si Java

Ciao,
In Java il discorso è un po' più complicato a parlare di casting.
Ti riferisci ai tipi primitivi, oppure ai polimorfici (nota veloce: Principio di sostituzione di Liskov v. wiki en che è un po' meglio)?
In Java il discorso è un po' più complicato a parlare di casting.
Ti riferisci ai tipi primitivi, oppure ai polimorfici (nota veloce: Principio di sostituzione di Liskov v. wiki en che è un po' meglio)?
Allora molto brevemente, upcasting e downcasting per quanto riguarda i tipi primitivi ricordano intuitivamente l'idea di promozione e troncamento.
In linea generale ,mettendo un cast "(Type)" stai dicendo al compilatore che vuoi una conversione di tipo.
Per i tipi primitivi questo dunque si esplica in: promozione / troncamento.
Per quanto riguarda questi due aspetti devi pensare alla teoria degli insiemi, ovvero:
$NNsubZZsubQQsubRR$.
Naturalmente considera che i tipi primitivi non rispecchiano esattamente la teoria insiemistica, infatti esistono anche numeri "unsigned-","long",("float","double").
L'idea intuitiva è: se io ho un intero, posso tranquillamente trasformarlo in un numero reale float o double. Perchè effettivamente $ZZsubRR$.
Allo stesso tempo se ho un reale a precisione singola float,posso trasformarlo in un reale a doppia precisione double.
La promozione o UpCasting viene comunque effettuata automaticamente dal compilatore e quindi sono pochi i casi in cui ti potrà effettivamente servire.
Vediamo il DownCasting.
In questo caso accade una perdita di informazione, un troncamento.
Se metti un cast da float a int, è chiaro che tutte le cifre dopo la virgola verranno troncate, da double a float ne verranno troncate 5 o 6 (non ricordo) ma comuque è un troncamento (non un'approssimazione).
In Java, essendo un linguaggio ad oggetti, questi concetti sono stati estesi anche per i Tipi non primitivi (ovvero quelli degli oggetti).
Il discorso qui si fa abbastanza lungo, ti accenno i punti principali.
E' necessario introdurre l'idea di superclasse, e sottoclasse.
E' chiaro che una sottoclasse, essendo figlia, di una superclasse può essere vista come una specializzazione della superclasse dunque se tu hai una superclasse Persona, e una sottoclasse Uomo. Puoi senza problemi dire che un Uomo è una Persona, viceversa no! Chiaramente ogni oggetto è un particolare Object.
Il downCast è molto pericoloso: devi essere sicuro che avendo in mano una Persona questa sia un uomo (puoi verificarlo facilmente con instance of). Il downCast (con l'utilizzo dei dispendiosi instance of) è molto sconsigliato, tranne nel caso di override della equals di Object.
Per evitare che si usasse il downCast in maniera massiva, fu introdotto il concetto di polimorfismo: tramite il late binding è possibile usare in modo polimorfico gli Oggetti.
Simile la questione delle interfacce e delle classi astratte.
In linea generale ,mettendo un cast "(Type)" stai dicendo al compilatore che vuoi una conversione di tipo.
Per i tipi primitivi questo dunque si esplica in: promozione / troncamento.
Per quanto riguarda questi due aspetti devi pensare alla teoria degli insiemi, ovvero:
$NNsubZZsubQQsubRR$.
Naturalmente considera che i tipi primitivi non rispecchiano esattamente la teoria insiemistica, infatti esistono anche numeri "unsigned-","long",("float","double").
L'idea intuitiva è: se io ho un intero, posso tranquillamente trasformarlo in un numero reale float o double. Perchè effettivamente $ZZsubRR$.
Allo stesso tempo se ho un reale a precisione singola float,posso trasformarlo in un reale a doppia precisione double.
La promozione o UpCasting viene comunque effettuata automaticamente dal compilatore e quindi sono pochi i casi in cui ti potrà effettivamente servire.
Vediamo il DownCasting.
In questo caso accade una perdita di informazione, un troncamento.
Se metti un cast da float a int, è chiaro che tutte le cifre dopo la virgola verranno troncate, da double a float ne verranno troncate 5 o 6 (non ricordo) ma comuque è un troncamento (non un'approssimazione).
In Java, essendo un linguaggio ad oggetti, questi concetti sono stati estesi anche per i Tipi non primitivi (ovvero quelli degli oggetti).
Il discorso qui si fa abbastanza lungo, ti accenno i punti principali.
E' necessario introdurre l'idea di superclasse, e sottoclasse.
E' chiaro che una sottoclasse, essendo figlia, di una superclasse può essere vista come una specializzazione della superclasse dunque se tu hai una superclasse Persona, e una sottoclasse Uomo. Puoi senza problemi dire che un Uomo è una Persona, viceversa no! Chiaramente ogni oggetto è un particolare Object.
Il downCast è molto pericoloso: devi essere sicuro che avendo in mano una Persona questa sia un uomo (puoi verificarlo facilmente con instance of). Il downCast (con l'utilizzo dei dispendiosi instance of) è molto sconsigliato, tranne nel caso di override della equals di Object.
Per evitare che si usasse il downCast in maniera massiva, fu introdotto il concetto di polimorfismo: tramite il late binding è possibile usare in modo polimorfico gli Oggetti.
Simile la questione delle interfacce e delle classi astratte.
Ok quindi in pratica l'upcast forza un oggetto di una sottoclasse ad essere considerato come uno di una sopraclasse, mentre il downcast è l'opposto ed è sconsigliato apparte in certi casi. Con il downcast perdo informazioni mentre con l'upcast no, è corretto?
Circa, con gli oggetti il downcast non solo in generale è sconsigliato (perchè il compilatore te lo lascia passare e può capitarti un RuntimeError) ma è indice anche di una cattiva programmazione (in generale significare aver progettato il programma con i piedi oppure non saper usare il polimorfismo).
Anche negli oggetti l'upcast avviene in maniera automatica e quindi non ti serve.
Anche negli oggetti l'upcast avviene in maniera automatica e quindi non ti serve.
Ok ho capito, grazie mille
