Número variable de Java o argumentos para un método

148

¿Es posible declarar un método que permita un número variable de parámetros?

¿Cuál es el simbolismo utilizado en la definición que indica que el método debe permitir un número variable de parámetros?

Respuesta: varargs

usuario69514
fuente
11
Como es tarea, no queremos saber tu pregunta, solo queremos saber que estás aprendiendo.
HDave

Respuestas:

276

Eso es correcto. Puede encontrar más información al respecto en la guía de Oracle sobre varargs .

Aquí hay un ejemplo:

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

que se puede llamar como

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
fuente
1
¿Es posible hacer varios tipos de parámetros? por ejemplo (String ... strs, int ... ints). ¿Qué pasa con cualquier tipo de argumento en cualquier orden?
trusktr
55
@trusktr: si quieres algún objeto, solo úsalo Object....
BalusC
2
@trusktr No, las primitivas no son objetos. Aquí hay una gran explicación de la diferencia: programmerinterview.com/index.php/java-questions/…
Dick Lucas
55
@ Richard: El uso Object... argsfuncionará con primitivas debido al autoboxing .
Sumit
1
@StevenVascellaro: Supongo que los argumentos se manejan como una matriz, por lo que probablemente podría simplemente hacerlovarargs.length
LMD
15
Variable number of arguments

Es posible pasar un número variable de argumentos a un método. Sin embargo, hay algunas restricciones:

  • El número variable de parámetros debe ser del mismo tipo.
  • Se tratan como una matriz dentro del método
  • Deben ser el último parámetro del método.

Para comprender estas restricciones, considere el método, en el siguiente fragmento de código, utilizado para devolver el entero más grande en una lista de enteros:

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

fuente Oracle Certified Associate Java SE 7 Programmer Study Guide 2012

Abey Ella
fuente
14

Si es posible:

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

Para diferentes tipos de argumentos, hay 3 puntos :

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

Entonces llámalo

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

por seguridad, use así:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

El principal inconveniente de este enfoque es que si los parámetros opcionales son de diferentes tipos, pierde la comprobación de tipo estático. Por favor, vea más variaciones .

T.Todua
fuente
0

Sí, Java permite el vargsparámetro del método.

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
Code_Eat_Sleep
fuente