Ambiguidade entre metodos

7 respostas
Gustavo_Santos
void Centrist(Integer... i) {
		inc += 1;
	}
	
	void Centrist(Integer[] i) {
		inc += 1;
	}

Galera esse métodos são iguais ? Essa declaração aqui Integer… i corresponde a essa: Integer[] i
Sei que um var-arg pode receber de nenhum a muitos argumentos.

7 Respostas

ViniGodoy

Sim, uma corresponde à outra.

No bytecode o varargs é automaticamente substituído pela segunda forma.

W

esses métodos não são iguais, um espera um var args isso significa (zero ou varios valores inteiros) o outro espera um array de inteiros, apenas uma variavel

robsonsm

o java considera como iguais e se colocar os dois nao irá compilar.
porém, se vc chamar o metodo desta forma:

apenas o metodo do vararg funcionaria void Centrist(Integer... i)

e

se passar um array os dois aceitam

tralsl

[quote=robsonsm]o java considera como iguais e se colocar os dois nao irá compilar.
porém, se vc chamar o metodo desta forma:

apenas o metodo do vararg funcionaria void Centrist(Integer... i)

e

se passar um array os dois aceitam

porque não compila? eu acho que compila sim
e o vararg não aceita arrays, apenas 0 ou mais primitivas int

RafaFloripa

nao compila

ele considera os dois metodos iguais

msm se chamar os metodos de maneira diferente nao eh um overload valido

tralsl

sim eu testei e realmente não compila
o compilador transforma o argumento variavel em um array
porém é possível declarar métodos sobrepostos usando mais de um int assim

foi com isso que confundi

ViniGodoy

O vararg é, em grande parte, um truque de compilação.

Quando o compilador está gerando o bytecode, ele transforma isso aqui:

void metodo(int ... valores) { }

Nisso aqui:

void metodo(int [] valores) { }

E cria um flag nas informações de classe para dizer que o método em questão é um vararg.

Depois, na chamada do método, quando o compilador encontra isso aqui:

metodo(1,2,3,4);

Ele automaticamente transforma para:

metodo(new int[] {1,2,3,4});

Dessa forma, o bytecode final pode ser facilmente compatibilizado para Java 4, que entende a segunda construção. Por isso, um método como:

Não é ambíguo. Já que um parâmetro como 2 ints é muito diferente de um array de ints. O compilador é esperto o suficiente para escolher o método mais próximo.

Criado 17 de setembro de 2010
Ultima resposta 18 de set. de 2010
Respostas 7
Participantes 6