Upcasting e downcasting

noipo
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

Risposte
garnak.olegovitc1
Salve,
ci riferiamo alla programmazione in java, o no?
Cordiali saluti

noipo
Si si Java :)

hamming_burst
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)?

lordb
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.

noipo
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?

lordb
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.

noipo
Ok ho capito, grazie mille :D

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.