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.