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

3 respostas
S
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");
		   }
		   
		  
 

}

é 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!! :D

3 Respostas

B

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.

T

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

S

vlww brrodo

entendi!!!

Criado 12 de maio de 2009
Ultima resposta 12 de mai. de 2009
Respostas 3
Participantes 3