2012-01-06 12 views

Odpowiedz

6

one skuteczne są takie same, z wyjątkiem kompilator nie będzie akceptować varargs chyba jego ostatni argument i nie pozwoli ci przekazać wielu argumentów do tablicy.

public void methodA(int... ints, int a); // doesn't compile 
public void methodA(int[] ints, int a); // compiles 

public void methodB(int... ints); // compiles 
public void methodC(int[] ints); // compiles 

methodB(1); // compiles 
methodB(1,2,3,4); // compiles 
methodC(1); // doesn't compile 
methodC(1,2,3,4); // doesn't compile 
1

String... aaa to tak jak posiadanie String[] aaa.

jestem przy założeniu, że średnik po drugiej funkcji jest literówka ...

1

Tak, to jest ten sam.

Możesz przeczytać this artykuł:

Nadal jest prawdą, że wiele argumentów muszą być przekazywane w tablicy, ale varargs posiadają automaty i ukrywa proces.

1

Atrybut [vararg] określa, że ​​metoda przyjmuje zmienną liczbę parametrów. Aby tego dokonać, ostatni parametr musi być bezpieczny tablicą typu wariant, który zawiera wszystkie pozostałe parametry:

[vararg [, optional-attributes]] return-type function-name(
[optional-param-attributes] param-list, 
SAFEARRAY(VARIANT) last-param-name); 

Składnia varargs zasadzie pozwala określić, że możliwe są parametry, prawda? Mogą tam być lub nie mogą tam być. Taki jest cel trzech kropek. Po wywołaniu tej metody można ją wywołać z tymi parametrami lub bez nich. Zostało to zrobione, aby uniknąć konieczności przekazywania tablic do metod.

Wystarczy popatrzeć na this:

Zobacz When do you use varargs in Java?

final public class Main 
{ 
    private void show(int []a) 
    { 
     for(int i=0;i<a.length;i++) 
     { 
      System.out.print(a[i]+"\t"); 
     } 
    } 

    private void show(Object...a) 
    { 
     for(int i=0;i<a.length;i++) 
     { 
      System.out.print(a[i]+"\t"); 
     } 

     System.out.println("\nvarargs called"); 
    } 

    public static void main(String... args) 
    { 
     int[]temp=new int[]{1,2,3,4};    

     Main main=new Main(); 
     main.show(temp); 
     main.show();   //<-- This is possible. 
    } 
} 

To z tego powodu, varargs nie jest w zasadzie zaleca się przeciążania metod.


System.out.printf(); jest przykładem varargs zdefiniowanych poniżej.

public PrintStream printf(String format, Object ... args) 
{ 
    return format(format, args); 
} 

Format - Ciąg formatu, jak opisano w format string składni

args - Argumenty użyte przez specyfikatorów formatu w ciągu formatu. Jeśli istnieje więcej argumentów niż specyfikatory formatu, dodatkowe argumenty są ignorowane. Liczba argumentów jest zmienna i może wynosić zero. Maksymalna liczba argumentów jest ograniczona przez maksymalny wymiar tablicy Java zdefiniowany w specyfikacji wirtualnej maszyny języka Java. Zachowanie w przypadku argumentu zerowego zależy od konwersji.

1

tak, są one takie same, ponieważ gdy wywołuje się metodę z elipsis (String ...), konwertuje się do tablicy String.

4

Od this SO discussion

Podstawowym typ zmiennej liczbie argumentów metody function(Object... args) jest function(Object[] args). Firma Sun dodała warianty w ten sposób, aby zachować kompatybilność wsteczną.

Więc, jak każda inna odpowiedź powiedziała, tak, są takie same.

1

Kompilator za kulisami faktycznie konwertuje metodę var args na metodę z wejściem tablicy. To jest powód, dla którego możesz mieć metodę var args przeciążoną tablicą jako danych wejściowych, ponieważ po kompilacji obie będą identyczne.

0

podczas wywoływania metody nie robi opieki o rodzaju powrotnej rozważy nazwę metody, ilość parametrów i typu parametrów i kolejność parametrów .Tutaj masz określające metodę o takiej samej nazwie samych parametrach .bcoz w przypadku zmiennej arg, jeśli wywołasz metodę z 2 parametrami, zostanie wykonana ta sama metoda, jeśli wywołasz metodę z 3 parametrami, wywoła ona tę samą metodę. tutaj, jeśli nazwiemy coś (String [] a) i coś (String ... aaa) ta sama metoda zostanie nazwana .bcoz możemy zastąpić tablicę var-arg, wtedy powstanie pomyłka, która powinna zostać wywołana. wówczas zajdzie niejednoznaczność metody. to dlatego pokazuje duplikat metody.

tutaj, jeśli przekażemy tablicę do metody parametru var - arg, to zostanie ona wykonana, a następnie przekształci zmienną var - args w tablicę jednowymiarową.

+1

Nie wiem, czy kwalifikuje się to jako odpowiedź, czy opisuje problem, który właśnie napotkano. – yvesmancera

+0

dziękuję Yvesmancera – krishna

+0

redagowałem odpowiedź – krishna

Powiązane problemy