Float e double na escolha de métodos! Explicação!

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:

  1. tipo primitivo
  2. autoboxing

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…