Номер змінної Java або аргументи для методу


146

Чи можливо оголосити метод, який дозволить змінювати кількість параметрів?

Яка символіка використовується у визначенні, що вказує на те, що метод повинен допускати змінну кількість параметрів?

Відповідь: varargs


11
З його домашнього завдання ми не хочемо знати вашого питання, ми просто хочемо знати, що ви дізнаєтесь.
HDave

Відповіді:


274

Це правильно. Докладніше про це можна знайти в посібнику Oracle про вараги .

Ось приклад:

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

яку можна назвати як

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
Чи можливо робити параметри різних типів? наприклад (String ... strs, int ... ints). А як щодо будь-якого типу аргументів у будь-якому порядку?
trusktr

5
@trusktr: якщо ви хочете будь-який об’єкт, просто використовуйте Object....
BalusC

2
@trusktr Ні, примітиви не є об'єктами. Тут є чудове пояснення різниці: programmerinterview.com/index.php/java-questions/…
Дік Лукас

5
@Richard: Використання Object... argsбуде працювати з примітивами через автобокс .
Суміт

1
@StevenVascellaro: Я припускаю, що аргументи обробляються як масив, так що ви, мабуть, могли просто зробитиvarargs.length
LMD

15
Variable number of arguments

Можливе передавання змінної кількості аргументів методу. Однак існують деякі обмеження:

  • Змінна кількість параметрів повинна бути одного типу
  • Вони розглядаються як масив у межах методу
  • Вони повинні бути останнім параметром методу

Щоб зрозуміти ці обмеження, розглянемо метод у наведеному нижче фрагменті коду, який використовується для повернення найбільшого цілого числа у списку цілих чисел:

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

Джерело Oracle Certified Associate Java SE 7 Посібник з вивчення програміста 2012



10

Для різних типів аргументів є 3 точки :

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

Тоді зателефонуйте

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

для безпеки використовуйте так:
if (!(x[0] instanceof String)) { throw new IllegalArgumentException("..."); }

Основний недолік такого підходу полягає в тому, що якщо необов'язкові параметри різного типу, ви втрачаєте статичну перевірку типу. Перегляньте більше варіантів .



0

Так, Java дозволяє vargsвводити параметр методу.

public class  Varargs
{
   public int add(int... numbers)
   { 
      int result = 1; 
      for(int number: numbers)
      {
         result= result+number;  
      }  return result; 
   }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.