Numéro de variable Java ou arguments pour une méthode


148

Est-il possible de déclarer une méthode qui autorisera un nombre variable de paramètres?

Quel est le symbolisme utilisé dans la définition qui indique que la méthode doit autoriser un nombre variable de paramètres?

Réponse: varargs


11
Depuis ses devoirs, nous ne voulons pas connaître votre question, nous voulons juste savoir que vous apprenez.
HDave

Réponses:


276

C'est correct. Vous pouvez en savoir plus à ce sujet dans le guide Oracle sur varargs .

Voici un exemple:

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

qui peut être appelé comme

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.

1
Est-il possible de faire différents types de paramètres? par exemple (String ... strs, int ... ints). Qu'en est-il de n'importe quel type d'argument dans n'importe quel ordre?
trusktr

5
@trusktr: si vous voulez un objet, utilisez simplement Object....
BalusC

2
@trusktr Non, les primitives ne sont pas des objets. Il y a une bonne explication de la différence ici: programmerinterview.com/index.php/java-questions/...
Dick Lucas

5
@Richard: L'utilisation Object... argsfonctionnera avec les primitives en raison de la boîte automatique .
Sumit

1
@StevenVascellaro: Je suppose que les arguments sont traités comme un tableau, donc vous pourriez probablement le faire simplementvarargs.length
LMD

15
Variable number of arguments

Il est possible de passer un nombre variable d'arguments à une méthode. Cependant, il existe certaines restrictions:

  • Le nombre variable de paramètres doit tous être du même type
  • Ils sont traités comme un tableau dans la méthode
  • Ils doivent être le dernier paramètre de la méthode

Pour comprendre ces restrictions, considérez la méthode, dans l'extrait de code suivant, utilisée pour renvoyer le plus grand entier dans une liste d'entiers:

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

source Oracle Certified Associate Java SE 7 Programmer Study Guide 2012


14

Oui c'est possible:

public void myMethod(int... numbers) { /* your code */ }

10

Pour différents types d'arguments, il y a 3 points :

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

Alors appelle-le

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

pour la sécurité, utilisez comme ceci:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

Le principal inconvénient de cette approche est que si les paramètres facultatifs sont de types différents, vous perdez la vérification de type statique. Veuillez voir plus de variations .



0

Oui Java autorise le vargsparamètre de méthode.

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.