10. Conversioni di tipo
Promozioni
- byte → short, int, long, float, double
- short → int, long, float, double
- int → long, float, double
- long → float, double
- float → double
- char → int, long, float, double
Casting
È possibile forzare una conversione mediante casting: (<tipo>)<espressione>
.
Tra tipi primitivi le seguenti conversioni forzate sono sempre ammesse:
- short → byte, char
- char → byte, short
- int → byte, short, char
- long → byte, short, char, int
- float → byte, short, char, int, long
- double → byte, short, char, int , long, float
- byte → char
Casting per gli oggetti
Se faccio un casting esplicito, cioè se uso la notazione var = (NewType) secondVar
, valgono le seguenti regole:
- supertipo —> sottotipo : NO
- sottotipo —> supertipo : SI
- Nota: a sinistra della freccia c’è il tipo di provenienza e a destra della freccia c’è il tipo di arrivo.
È anche possibile forzare la conversione dal tipo referenziato T a un suo sottotipo T1: a differenza del caso descritto sopra, si può fare a patto che si faccia utilizzo del polimorfismo prima.
// Esempio
public class Animal{...}
public class Cat extends Animal{...} // La classe Cat è sottoclasse della classe Animal
// CASO 1:
Animal an = new Animal();
Cat ca = new Cat();
ca = (Cat)an; // NO!! sto cercando di fare il downcasting di an e di assegnare il risultato ad un oggetto di tipo Cat
// CASO 2:
Animal an;
Cat ca = new Cat();
an = ca; // Uso il polimorfismo: a questo punto il tipo dinamico di an è Cat
ca = (Cat)an; // Dato che il tipo dinamico di an è Cat, ora posso fare il casting esplicito e fare l'assegnamento
instaceof
Per evitare errori a runtime e determinare qual è il tipo dinamico di un oggetto è possibile usare l’operatore unario instanceof
.
if (a instanceof String)
System.out.println("1");