Duvida básica, escolha de método

Tenho os seguintes métodos:

[code]public static void main(String[] args) {

int[] numeros = {1,2,3};
teste(new Integer[2]);
teste(numeros);
[/code]

[code]public static void teste (Object numero){
	
	System.out.println("object");
}[/code]

             [code]public static void teste (Object...numero){
	
	System.out.println("varargs object");
}[/code]

Bom pelo que eu aprendi os métodos com varargs são a ultima opção em prioridades, porque o metodo que passa um wrapper Integer chama o método varags e o int segue a regra e chama somente o que possui um Object?

Na verdade, seu código confunde um pouco o compilador, tanto é que ele apresenta um warning. Eu recompilei seu programa:

class Puzzle {
    public static void main(String[] args) {  
   
        int[] numeros = {1,2,3};  
        teste(new Integer[2]);  // imprime "varargs object", mas causa o seguinte warning:
//Puzzle.java:5: warning: non-varargs call of varargs method with inexact argument
// type for last parameter;
//cast to java.lang.Object for a varargs call
//cast to java.lang.Object[] for a non-varargs call and to suppress this warning
//        teste(new Integer[2]);
//        ^

        teste(numeros);         // imprime "object"
    }
    public static void teste (Object numero) {  
        System.out.println("object");  
    } 
    public static void teste (Object...numero) {  
        System.out.println("varargs object");  
    }
}

Como isso é para certificação, não se atenha a tais detalhes - você não é obrigado a saber que o compilador vai gerar um warning porque a construção que você está usando é questionável - não sei se, usando o compilador do Eclipse, você não vai obter um resultado diferente.

Em uso profissional, você procura evitar os warnings, até para que você ou outra pessoa não tenha dificuldade em entender seu programa.

entanglement eu to usando o eclipse e ele nao me da nenhum Warning, ai gerou essa duvida pra mim, na qual não entendi, se isso cai em certificação eu iria errar por que na minha concepçao seria o Object somente, e até agora não entendi o pq que o wrapper Integer faz a chamda ao método com varargs.

Sinistraço!!!
:smiley:

kkkk FALAAAA LEOOOOO

Gostei da questão.

Pelo o que eu pesquise acontece o seguinte:

  • Um método que possuir varargs é invocado passando Object[] -> method.invoke(instance, Object[]);
  • Quando você tem um método não-varargs e chama com Object[] ele vai será invocado assim -> method.invoke(instance, Object[]);

Daí o warning dizendo que você está fazendo uma chamada não-varargs à um método varargs.
Então, minha conclusão é: Não é que neste caso o compilador preferiu varargs, mas ele entendeu a chamada ao método como uma chamada varargs.

Fonte:
http://www.coderanch.com/t/328722/Java-General/java/Passing-array-into-vararg-method

Tá bom, vou falar em português mais claro (já que você não me entendeu): tal tipo de coisa esquisita, que chega a provocar mensagens estranhas do compilador, não cai em provas de certificação.
E ponto final.

É cara entender entender vou ser sincero nao entendi, o pq com objeto faz chamada a varargs e com primitivo não, mas tudo bem vlw pela ajuda de qualquer forma.

A diferença é que você pode chamar dois métodos:

method.invoke(instance, Object)
method.invoke(instance, Object[]) – esse é o varargs

Quando você passa int[] - O mais próximo é Object
Quando você passa String[] - O mais próximo é Object[]

Por isso ele escolhe o varargs.

Isso que eu entendi pelo menos. A questão está relacionado à como o método varargs é invocado.
Para ilustrar melhor o que estou falando tente colocar os dois métodos seguintes na mesma classe:
public static void teste (Object[] numero){ }
public static void teste (Object… numero){ }

O compilador não deixa. Porque na hora de invocar ele não vai saber qual dos dois chamar.

hum eu etendi agora, pq um array int[] e do tipo primitivo, e ele entra em Object porque um array é um objeto.
e um Integer[] é um array de objetos por isso ele entra em Object[].

Vlw kaduzick

Mas cuidado, um array de objetos tambem é um objeto.
A seguinte expressão é valida:

Object o = new Object[5];