[DUVIDA] Questao do Inquisition ---- AJUDAAAA!

[code]import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Queue;

class Teste
{

   public static void main(String[] args) {
	   
	   
	   Teste inst_test = new Teste();
	      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( double... i ){
	      System.out.println("Fly in the pie");
	   }

}
[/code]

é o seguinte…

se eu coloco o var-args como double…i , o programa reclama [size=18]“The method method(Integer[]) is ambiguous for the type Teste”[/size]

porém se eu coloco Double…i ao invés de double…i , ele roda normalmente.

Não entendi porque isto acontece…me ajudem por favor!

vlwww!! :smiley:

A primeira coisa a ser tentada ao invocar um método com passagem de parâmetros, é não fazer nenhuma modificação a eles (Widening ou Boxing), depois tenta-se ampliá-los (Widening), se ainda assim os parâmetros não forem adequados, tenta-se o Boxing. Por último tenta encontrar alguma ocorrência que utiliza var-args.

O que acontece é o seguinte:

  • “inst_test.method ( 1 , 1 , 1);” -> irá imprimir “Fly in the pie”. Pois irá escolher o método “method( double… i )”, o qual os parâmetros apenas serão ampliados. (repare que primeiro tenta-se ampliar, portanto tornam-se doubles ao invés de Integers).

  • “inst_test.method( new Integer(1) , new Integer(2) , new Integer(3) );” -> irá imprimir “Eye in the sky”. Pois irá escolher o método “method( Integer… I )”, o qual os parâmetros não serão modificados.

Ok. Agora temos:

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

Neste caso há uma indefinição, ou os elementos deverão ser unboxed, ou deverão ser boxed, o que torna impossível a escolha de qualquer um dos métodos. Compiler Error!

Quando vc disse modificar o segundo método para “method( Double… i )”, o código compila, pois agora os parâmetros serão todos Boxed e se enquadrarão em “method( Integer… I )”, desfazendo a ambiguidade.

Espero que tenha dado pra entender.

A resposta do brrodo está corretíssima. Não há reparos a fazer.

vlww brrodo

entendi!!!