Numer zmiennej Java lub argumenty metody

146

Czy można zadeklarować metodę, która pozwoli na zmienną liczbę parametrów?

Jaka symbolika użyta w definicji wskazuje, że metoda powinna dopuszczać zmienną liczbę parametrów?

Odpowiedź: varargs

user69514
źródło
11
Ponieważ jest to praca domowa, nie chcemy znać twojego pytania, chcemy tylko wiedzieć, że się uczysz.
HDave

Odpowiedzi:

274

To jest poprawne. Więcej na ten temat można znaleźć w poradniku Oracle dotyczącym varargów .

Oto przykład:

void foo(String... args) {
    for (String arg : args) {
        System.out.println(arg);
    }
}

które można nazwać jako

foo("foo"); // Single arg.
foo("foo", "bar"); // Multiple args.
foo("foo", "bar", "lol"); // Don't matter how many!
foo(new String[] { "foo", "bar" }); // Arrays are also accepted.
foo(); // And even no args.
BalusC
źródło
1
Czy można robić różnego rodzaju parametry? np. (String ... strs, int ... ints). A co z każdym rodzajem argumentu w dowolnej kolejności?
trusktr
5
@trusktr: jeśli potrzebujesz obiektu, po prostu użyj Object....
BalusC
2
@trusktr Nie, prymitywy nie są obiektami. Tutaj jest świetne wyjaśnienie różnicy: programmerinterview.com/index.php/java-questions/ ...
Dick Lucas,
5
@Richard: Używanie Object... argsbędzie działać z prymitywami z powodu autoboxingu .
Sumit
1
@StevenVascellaro: Zakładam, że argumenty są obsługiwane jak tablica, więc prawdopodobnie możesz po prostu zrobićvarargs.length
LMD
15
Variable number of arguments

Możliwe jest przekazanie zmiennej liczby argumentów do metody. Istnieją jednak pewne ograniczenia:

  • Zmienna liczba parametrów musi być tego samego typu
  • W metodzie są traktowane jako tablice
  • Muszą być ostatnim parametrem metody

Aby zrozumieć te ograniczenia, rozważ metodę w poniższym fragmencie kodu używaną do zwracania największej liczby całkowitej na liście liczb całkowitych:

private static int largest(int... numbers) {
     int currentLargest = numbers[0];
     for (int number : numbers) {
        if (number > currentLargest) {
            currentLargest = number;
        }
     }
     return currentLargest;
}

źródło Oracle Certified Associate Java SE 7 Programmer Study Guide 2012

Abey Ella
źródło
14

Tak, to możliwe:

public void myMethod(int... numbers) { /* your code */ }
Dolph
źródło
10

W przypadku różnych typów argumentów są 3 kropki :

public void foo(Object... x) {
    String myVar1  = x.length > 0 ? (String)x[0]  : "Hello";
    int myVar2     = x.length > 1 ? Integer.parseInt((String) x[1]) : 888;
} 

Więc zadzwoń

foo("Hii"); 
foo("Hii", 146); 

ze względów bezpieczeństwa użyj w ten sposób:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

Główną wadą tego podejścia jest to, że jeśli parametry opcjonalne są różnych typów, tracisz sprawdzanie typu statycznego. Zobacz więcej odmian .

T.Todua
źródło
0

Tak Java dopuszcza vargsparametr metody.

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
Code_Eat_Sleep
źródło