É, tem mais pegadinhas. Não fique pensando que ia se livrar fácil daquelas coisas, porque se dá pra complicar ainda mais, é isso que eles vão fazer. Conhece a Lei de Murphy?
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:
Porque E já que a gente começou a falar de passagem por parâmetro...
Quem ganha? Widening. O programa exibe:
Quem ganha? Widening. O programa exibe:
Quem ganha? Widening. O programa exibe:
Mas porque? Simples. Em ordem de "custo de implementação", o compilador prefere:
Mais pegadinha. Isso compila?
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.
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.
No comments:
Post a Comment
Regras são chatas, mas...
Todos os comentários são lidos e moderados previamente.
São publicados aqueles que respeitam as regras abaixo:
- Seu comentário precisa ter relação com o assunto do post;
- Em hipótese alguma faça propaganda de outros blogs ou sites;
- Não inclua links desnecessários no conteúdo do seu comentário;
- Se quiser deixar sua URL, comente usando a opção OpenID;
- CAIXA ALTA, miguxês ou erros de ortografia não serão tolerados;
- Ofensas pessoais, ameaças e xingamentos não são permitidos;