[SCJP 6] main var-arg

8 respostas
tralsl

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?

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"));
    }
}

8 Respostas

tralsl

:lol: não compila

Hebert_Coelho

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 :wink:

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. :slight_smile:

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

Criado 20 de julho de 2010
Ultima resposta 20 de jul. de 2010
Respostas 8
Participantes 4