void testDoit()
{
float f = 3.14f;
doIt(f);
}
void doIt(Float f)
{
System.out.println("Float");
}
void doIt(double f)
{
System.out.println("double");
}
Pessoal,
porque a saída desse trecho de código é “double” ?
Abraços!
void testDoit()
{
float f = 3.14f;
doIt(f);
}
void doIt(Float f)
{
System.out.println("Float");
}
void doIt(double f)
{
System.out.println("double");
}
Pessoal,
porque a saída desse trecho de código é “double” ?
Abraços!
oalexandrino,
não tem nada de anormal com a saída.
O problema é o seguinte:
Você está passando um valor primitivo, float, como parâmetro. E como você deve saber um tipo float pode ser aceito como um double, mas não como o objeto Float. Esse é o “erro”.
Segue abaixo o seu código alterado:
[code] void testDoit()
{
float f = 3.14f;
doIt(f);
}
void doIt(float f)
{
System.out.println(“float”);
}
void doIt(double f)
{
System.out.println(“double”);
} [/code]
Descobri!
Bem, acredito que seja isso!
Boa questão para a prova gente!
De acordo com o “Java Primitive Data Types”
temos que, um “float” é um “double”…não exatamente em relação a herança pois eles são tipos primitivos, mas matematicamente falando
double CONTÉM float pois
double tem 64 bits de tamanho, enquanto
float tem 32 bits de tamanho
é como se fosse:
double d = 4.12F;
é uma conversão válida!
enquanto
float f = 4.12D; NAO!
daria esse estouro: “Type mismatch: cannot convert from double to float”
então apesar de ser automatico no Java 5…
Float f = 4.12F;
no exemplo anterior, como float é um double…o método com “double” leva “vantagem” ao outro método (Float) !
alguem discorda?
abraços!
valeu Petronio!
voce está certo, porém na questao realmente era “Float” ao inves de “float” para confundir mesmo!
se não tivessemos o segundo método, a saida seria “Float”
Abraços!
oalexandrino,
isso só ocorre (se não tivessemos o segundo método, a saida seria “Float”) eu, por você está usando a versão 5 do JAVA que faz autoboxing (Envólucro automático de tipos primitivos como objetos).
Fique atento a esse pequeno detalhe.
Na versão 1.4 do JAVA, isso daria um erro.
A questão é a seguinte, apesar de você está usando o Java 5, o compilador opta por escolher o método na seguinte ordem:
Na hora de saber qual o método sobrecarregado o progarama irá usar, tem uma ordem de hierarquia na chamada, entre primitivos, classes, autoboxing, widening e varargs.
O livro da Kate Sierra explica bem isso.
a diferença entre o double e o float parceiro que o double é mais preciso que o float… o double armazena 64 bits o float 32 bits. vc nao pode colocar o double dentro do float de forma implicita… hehe…