Il casting in Java non è magico, stai dicendo al compilatore che un Object di tipo A è in realtà di tipo B più specifico, ottenendo così l'accesso a tutti i metodi su B che altrimenti non avresti avuto. Non stai eseguendo alcun tipo di magia o conversione quando esegui il casting, essenzialmente stai dicendo al compilatore "fidati di me, so cosa sto facendo e posso garantirti che questo oggetto su questa riga è in realtà un <Inserisci cast digita qui>. " Per esempio:
Object o = "str";
String str = (String)o;
Quanto sopra va bene, non magico e va bene. L'oggetto memorizzato in o è in realtà una stringa, quindi possiamo eseguire il cast su una stringa senza problemi.
Ci sono due modi in cui questo potrebbe andare storto. In primo luogo, se stai eseguendo il casting tra due tipi in gerarchie di ereditarietà completamente diverse, il compilatore saprà che sei sciocco e ti fermerà:
String o = "str";
Integer str = (Integer)o;
In secondo luogo, se si trovano nella stessa gerarchia ma sono ancora un cast non valido, ClassCastExceptionverrà lanciato un a runtime:
Number o = new Integer(5);
Double n = (Double)o;
Ciò significa essenzialmente che hai violato la fiducia del compilatore. Hai detto che puoi garantire che l'oggetto è di un tipo particolare, e non lo è.
Perché hai bisogno di casting? Bene, per iniziare ne hai bisogno solo quando passi da un tipo più generale a un tipo più specifico. Ad esempio, Integereredita da Number, quindi se vuoi memorizzare un Integercome a Numberallora va bene (dato che tutti i numeri interi sono numeri). Tuttavia, se vuoi andare dall'altra parte hai bisogno di un cast - non tutti i numeri sono interi (come pure as Integer abbiamo Double, Float, Byte, Long, ecc) e anche se c'è solo una sottoclasse nel vostro progetto o il JDK, qualcuno potrebbe facilmente creare un altro e distribuire che, così hai alcuna garanzia, anche se si pensa che è un unico, scelta obbligata !
Per quanto riguarda l'uso per il casting, ne vedi ancora la necessità in alcune librerie. Prima di Java-5 è stato utilizzato pesantemente nelle raccolte e in varie altre classi, poiché tutte le raccolte hanno lavorato sull'aggiunta di oggetti e quindi sul casting del risultato che si ottiene di nuovo dalla raccolta. Tuttavia, con l'avvento dei generici gran parte dell'uso per il casting è andato via - è stato sostituito da generici che forniscono un'alternativa molto più sicura, senza il potenziale per ClassCastExceptions (infatti se usi i generici in modo pulito e si compila senza avvertimenti, hai la garanzia che non riceverai mai un'eccezione ClassCastException.)