Float f = Float.parseFloat("3.14f"); Double d = f; //FAIL
Float f = Float.parseFloat("3.14f"); Double d = (Double) f; //FAIL
Não vá achando que é possivel transformar um wrapper em outro. Isso não rola. Não há herança entre eles. Não é possivel fazer um cast entre eles. Dá merda. Tentar fazer isso na passagem por parâmetro então, nem se fala. Mas isso funciona:
Float f = Float.parseFloat("3.14f"); Object o = (Float) f; //OWNED!
Porque E já que a gente começou a falar de passagem por parâmetro...
Widening: quando a gente transforma uma variável primitiva de um tipo "menos abrangente" para um "mais abrangente".
Boxing: quando a gente "encapsula" um literal em um wrapper.
public class Principal { public static void teste(Integer i) { System.out.println( "Integer"); } public static void teste(long l) { System.out.println( "long"); } public static void main(String[] args){ int i = 10; teste(i); } }
Quem ganha? Widening. O programa exibe:
long
public class Principal { public static void teste(int x, long y) { System.out.println( "int, long"); } public static void teste(byte... z) { System.out.println( "byte..."); } public static void main(String[] args){ byte i = 10; teste(i,i); } }
Quem ganha? Widening. O programa exibe:
int, long
public class Principal { public static void teste(Byte x, Byte y) { System.out.println( "Byte, Byte"); } public static void teste(byte... z) { System.out.println( "byte..."); } public static void main(String[] args){ byte i = 10; teste(i,i); } }
Quem ganha? Widening. O programa exibe:
Byte, Byte
Mas porque? Simples. Em ordem de "custo de implementação", o compilador prefere:
- Widening
- Autoboxing
- Lista variável de parâmetros
Mais pegadinha. Isso compila?
public class Principal { public static void teste(Integer i) { System.out.println( "Integer"); } public static void main(String[] args){ byte i = 10; teste(i); } }
NEGATIVO. Não é possivel fazer um box e um widening (ou vice versa). Quem diz isso é o compilador, então eu não tenho culpa de nada.