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!
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.