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.
