Agora Java permite métodos com número variável de argumento, conhecidos como var-args e alguns outro nomes, essa é a sintaxe
public void meuMetodoComVarArg(Object ... argumentoVariavel)
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?
classMinhaClasseComVarArg{publicvoidmeuMetodoComVarArg(Object...argumentoVaraivel){System.out.println("legal, virou array");for(Objectobj:argumentoVariavel){System.out.println(obj);}}publicstaticvoidmain(String[]a){System.out.println("main com array");newMinhaClasseComVarArg().meuMetodoComVarArg("array",3,":P");}publicstaticvoidmain(String...b){System.out.println("main com var-arg");newMinhaClasseComVarArg().meuMetodoComVarArg("var-arg",3,newStringBuilder(":P"));}}
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
tralsl
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
8) a intenção era exatamente essa, comprovar que dois métodos mains, mesmo com lista de argumentos diferentes não compilam
ViniGodoy
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:
ViniGodoy
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.
Mavericks
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.
ViniGodoy
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.
tralsl
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