Escolha do método

5 respostas
D

Porque chama o varargs e nao o metodo que so contem Object?

Long[] l = {1L,2L,3L};
		go(l);
		
	}
		
	static void go(Object l){
		System.out.println("Object");
	}
	
	static void go(Object...l){
		
		Long[] a = (Long[]) l;
		
		for(long b : a){
			System.out.println(b);
		}
		
	}

5 Respostas

Eric_Yuzo

Por que você está passando um array.

O primeiro método não está preparado para receber um Object[] e sim um Object.

Desculpe se não fui muito claro.

D

entao porque aqui ele chama o que so tem Object e nao o que é varargs:

int[] l = {1,2,3};
		go(l);
		
	}
		
	static void go(Object l){
		System.out.println("Object");
	}
	
	static void go(Object...l){
			
		System.out.println("Varargs Object");
	}
Eric_Yuzo

Testei aqui esta implementação e percebi que quando declaro como Integer[] eu consigo fazer um cast tanto para Object quanto para Object[]:

Integer[] l = {1,2,3}; go((Object) l); go((Object[]) l);

Já com int[] não consigo fazer este cast.

Já a explicação técnica eu fico devendo.

Se alguém puder explicar eu agradeço, pois fiquei curioso também.

Valeu.

B
Eric Yuzo:
Testei aqui esta implementação e percebi que quando declaro como Integer[] eu consigo fazer um cast tanto para Object quanto para Object[]:
Integer[] l = {1,2,3};
	go((Object) l);
	go((Object[]) l);

Já com int[] não consigo fazer este cast.

Já a explicação técnica eu fico devendo.

Se alguém puder explicar eu agradeço, pois fiquei curioso também.

Valeu.

class TestCast{
	public static void main(String[] args) {

		// Todo array é um objeto, portanto:
		Object obj1= new Integer[]{1,2,3}; //OK  (AUTOBOXING NOS ELEMENTOS)
		Object obj2= new int[]{1,2,3}; //OK
		
		/* Entretanto, somente Integer[] é um array que possui Objetos
		 * int[] é um Objeto Array que possui elementos primitivos (E não um Objeto array que possui elementos Object)
		 */
		
		Object[] obj3=(Object[]) new Integer[]{1,2,3}; //OK  (AUTOBOXING NOS ELEMENTOS)
		Object[] obj4=(Object[]) new int[]{1,2,3}; //ERRO (Cannot cast int[] to Object[])
	}
}

Agora quanto ao cast, troque a chamada de varargs para array:

Long[] l = {1L,2L,3L};  
    go(l);  

	static void go(Object l){  
	    System.out.println("Object");  
	}  
	
	static void go(Object[] l){  
		System.out.println("Object[]");  
	}

O código dá prioridade para chamadas sem o cast, portanto chama o método com Object[].

Agora algo curioso que eu não havia visto antes, tente criar estes métodos:

Long[] l = {1L,2L,3L};  
    go(l);  

      
	static void go(Object l){  
	    System.out.println("Object");  
	}  
	
	static void go(Object[] l){  
		System.out.println("Object");  
	}  
  
	static void go(Object...l){  /// ERRO !
	    System.out.println("Varargs");  
	}
Ele te dá um erro de compilação avisando que go(Object[] l) e go(Object...l) são duplicatas. Provavelmente o compilador processa um varaarg como um array. Algo que eu não sabia (ou já soube e esqueci, hehehe) Isto explica porque ele escolheu este método. O compilador dá prioridade ao array ao invés de realizar o cast, e Object...l é interpretado como array.
Eric_Yuzo

Valeu pela explicação Brunofs.

Caminhamos, vivemos e aprendemos!

Valeu…

Criado 5 de setembro de 2010
Ultima resposta 6 de set. de 2010
Respostas 5
Participantes 3