Dúvida de array em questão de argumento para método (questão de certificação)

5 respostas
M

Olá pessoal estou com uma dúvida em uma questão de certificação que vi em um simulado aqui.

A questão é a seguinte:

class test {

public static void main(String[] args) {

test inst_test = new test();

inst_test.method ( 1 , 1 , 1);

inst_test.method( new Integer(1) , new Integer(2) , new Integer(3) );

inst_test.method ( 1 , new Integer(5) );

inst_test.method ( new Integer(10) , 1 );

}

public void method( Integer I ){

System.out.println(Eye in the sky);

}

public void method( int i ){

System.out.println(Fly in the pie);

}

}

===== Isso apresenta da um erro de compilador por ambiguidade dos parâmetros do método. Até ai tudo bem !!!

Mas se trocarmos o parêmetro do segundo método assim:

public void method( int[] i ){

System.out.println(Fly in the pie);

}

===== Ele não apresenta ambiguididade e a saída será:
Eye in the sky
Eye in the sky
Eye in the sky
Eye in the sky

=================================================
A pergunta é a seguinte: Qual a diferença, para o compilador, quando eu declado o array com [] e quando eu declado com (…)?
Porque a ambiguidade não continua?
Procurei na internet e em meus materiais de estudo e não encontrei nada a respeito! Alguém pode me dar uma luz!

Agradeço.

5 Respostas

mduques
ViniGodoy

Quando for postar código, por favor, siga essas dicas:
http://www.guj.com.br/posts/list/50115.java

É que quando vc declara o array[], você não está admitindo a entrada em varargs.

Para usar esse método:

public void method( int[] i ){ System.out.println("Fly in the pie"); }

Você deve usar a seguite sintaxe:

Hellmanss

Vale citar que o compilador sempre busca um metodo mais específico possível para os parametros informados.

Exemplo:

public class Teste {
	public static void main(String[] args) {
		new Teste().soma(45, 45, 45);
		new Teste().soma(45, 45);
		new Teste().soma(45);
	}

	public void soma(int... i) {
		System.out.println("Parametro: varargs");
	}

	public void soma(int inteiro, int inteiro2) {
		System.out.println("Parametro: 2 inteiros");
	}

	public void soma(int inteiro) {
		System.out.println("Parametro: 1 inteiro");
	}
}

Saída:

Parametro: varargs
Parametro: 2 inteiros
Parametro: 1 inteiro

ViniGodoy
Hellmanss:
Vale citar que o compilador sempre busca um metodo mais específico possível para os parametros informados.

Nem sempre.

Você pode ter problemas com isso aqui:

public void metodo(Object obj) {
//Faz qualquer coisa
}

public void metodo(Integer obj) {
//Faz qualquer coisa
}

Como Integer é filho de Object, não há garantias de que ele chamará o segundo método quando vc usar um Integer como parâmetro. Já tive problemas sérios com isso.

M

Obrigado pela dica sobre postar os códigos …

Esclareceram minha Dúvida também sobre a diferença em questão.

Criado 26 de agosto de 2009
Ultima resposta 26 de ago. de 2009
Respostas 5
Participantes 4