Var-args versus Boxing

Pessoal, estava dando uma estudada em overloading utilizando var-args e autoboxing.

Modifiquei um exemplo do livro da Kathy e tive um resultado que não esperava:

[code]class TesteOverloading5BoxVarArg {
static void wide_var_arg(long … x) {System.out.print(“long …”);}
static void wide_var_arg(Integer … x) {System.out.print(“Integer …”);}
public static void main (String [] args) {
int i = 5;
wide_var_arg(i,i);
}

}[/code]
Obtive como resultado da compilação:

TesteOverloading5BoxVarArg.java:8: reference to wide_var_arg is ambiguous, both method wide_var_arg(long...) in TesteOverloading5BoxVarArg and method wide_var_a rg(java.lang.Integer...) in TesteOverloading5BoxVarArg match wide_var_arg(i,i); ^

Ou seja, o compilador não sabe qual dos métodos utilizar. Eu pensava que tinhamos Widen->Box, assim o método com o parâmetro long… seria chamado.

Não lembro de ter visto no livro questões desse tipo. Isso pode cair desta forma na certificação ?

Obrigado pessoal.

Cara, acho que pode cair sim, questões desse tipo no exame. Ao menos, já vi algumas nos mocks que fiz.

Reforçando o que vc postou, se vc receber no argumento um array de Integer e um vararg de Integer, ele também será um método ambíguo e nem compilará.

Veja um exemplo:

static void wide_var_arg(Integer ... x) {System.out.print("Integer ...");} static void wide_var_arg(Integer[] x) {System.out.print("Integer[]");}
Bons estudos !

o que ele te informa é que ele pode fazer as duas coisas…

então o compilador não sabe qm chamar.

em caso de var-args e auto-boxing, ele sempre utilizará o auto-boxing.

[s]
baiano

Pelo que vi nesses métodos a sequência de escolha do compilador é:

  1. Ampliar o tipo primitivo
  2. Usar um método que aceita Wrapper correspondente ao tipo
  3. Usar um método que aceita um Number
  4. Usar um método que aceita um Object
  5. Finalmente, usar varargs.

Do mais específico ao mais genérico… sendo a última opção um tanto frágil no sentido da não correspondência/ambiguidade… Ótimo ponto para se ferrar na prova.

Caraca George… que avatar legal !!! Conhece a técnica POG ? De frases como a abaixo…

"Escrevi só algumas linhas, dei CTRL+C e CTRL+V e o sistema estava pronto."
http://desciclo.pedia.ws/wiki/POG

Será que pode cair questões desse tipo na prova???

No livro fda Kathy ñ fala nada sobre essa confusão do compilador!!

:?:

cara tenha certeza caiu na minha porem 1 questao sim… os recursos novos do java 5 foram abordados todos, no minimo 2 questoes de cada… esse ai so teve 1 e ele envolveu todas as regras para saber qual ia chamar… claro entao tem q lebrar a ampliacao tem maior prioridade que qualquer outro novo recurso var-args e autoboxing… caiu bem semalhante ao q tem no cap 3 da kathy no objetivo 1.4 - sobrecarregando. :smiley:

Nao entendi muito bem por que a confusao do compilador, se alguem puder explicar ( denovo ) de outro jeito.
Quando vi o código achei que ele fosse usar o método que chama o wrapper Integer.