[SCJP 6] main var-arg

Agora Java permite métodos com número variável de argumento, conhecidos como var-args e alguns outro nomes, essa é a sintaxe

então agora há duas maneiras de criar o método main, então qual metodo a JVM vai decidir chamar?
ou o compilador não permite?

[code]class MinhaClasseComVarArg{

public void meuMetodoComVarArg(Object ... argumentoVaraivel){
    System.out.println("legal, virou array");
    for(Object obj : argumentoVariavel){
        System.out.println(obj);
    }
}

public static void main(String[] a){
    System.out.println("main com array");
    new MinhaClasseComVarArg().meuMetodoComVarArg("array",3,":P");
}

public static void main(String... b){
    System.out.println("main com var-arg");
    new MinhaClasseComVarArg().meuMetodoComVarArg("var-arg",3,new StringBuilder(":P"));
}

}[/code]

:lol: não compila

Mano, sua classe ta com 2 métodos mains definidos do mesmo modo.

O método main pode ser chamado com String… ou String[]

Rank um dos 2 que tudo vai bem! [=

C ya

[quote=jakefrog]Mano, sua classe ta com 2 métodos mains definidos do mesmo modo.

O método main pode ser chamado com String… ou String[]

Rank um dos 2 que tudo vai bem! [=

C ya[/quote]
8) a intenção era exatamente essa, comprovar que dois métodos mains, mesmo com lista de argumentos diferentes não compilam :wink:

Os varargs são apenas um syntax suggar, um truque do compilador.

Um método declarado como

Depois de compilado se transforma em:

O que o java faz é transformar chamadas como:

Em:

Só me corrigindo. Será um syntax suggar se o código for compilado compatível com Java 4, e para efeitos práticos.

Mas no bytecode do Java 5, o compilador inclui a informação de que o método é declarado com varargs nas informações de meta-classe, para que você possa testar isso via reflexão. É o que torna a existência de métodos como isVarArgs possível.

Entretanto, para efeitos de busca pelo método em funções como “getDeclaredMethods”, os varargs também aparecerão como arrays.

tralsl
O que você pode fazer é o seguinte:

e

Nesse caso, em uma chamada a meuMetodo com dois argumentos, sempre acionará sem varArgs, pois tem precedência maior do que o método com varArgs. Com um ou mais de dois argumentos, acionará o método com varArgs.

Outra assinatura interessante é essa:

O método pode ser usado igualzinho a um varargs, com a diferença de que pelo menos 1 parâmetro é obrigatório. :slight_smile:

vlw Mavericks e Vinigodoy

mas a minha dúvida não era sobre as regras de uso dos var-args nem sobre as regras de precedência entre métodos (ampliação > autoboxing > var-args),
o livro da Kathye é bem claro sobre isso,
mas não fala nada sobre a possibilidade de haver mais de um método main,
pois como o Maverick já demostrou é possível ter métodos sobrepostos com os argumentos “String[]” e “String…”,
como :public static void noMain(String[] a){}epublic static void noMain(String... a){}
pra tirar minha dúvida escrevi o código do primeiro post, e verifiquei que o compilador reclama assim

cannot declare both main(java.lang.String...) and main(java.lang.String[]) in MinhaClasseComVarArg public static void main(String... a){…e resolvi copartilhar com a comunidade,
mesmo assim abrigado pelas respostas