варагс и аргумент "..." - PullRequest
45 голосов
/ 01 ноября 2009

Рассмотрим объявление метода:

String.format(String, Object ...)

Аргумент Object ... является просто ссылкой на массив Object с. Есть ли способ использовать этот метод со ссылкой на фактический массив Object? Если я передам массив Object аргументу ... - будет ли значение результирующего аргумента двух размерный массив - потому что Object[] сам по себе является Object:

Object[] params = ....; // Make the array (for example based on user-input)
String s = String.format("%S has %.2f euros", params);

Таким образом, первый компонент массива (который используется в методе String.format) будет массивом, и он сгенерирует:

[class.getName() + "@" + Integer.toHexString(hashCode())] 

, а затем ошибка, потому что размер массива равен 1.

Последовательность полужирный является реальным вопросом.
Это второй вопрос: Имеет ли массив / параметр ... имя?

Ответы [ 3 ]

53 голосов
/ 01 ноября 2009

Из документов на varargs :

Три периода после финала Тип параметра указывает на то, что последний аргумент может быть передан как массив или как последовательность аргументов.

Таким образом, вы можете передать несколько аргументов или массив.

Следующее работает просто отлично:

class VarargTest {
  public static void main(String[] args) {
    Object[] params = {"x", 1.2345f};
    String s = String.format("%s is %.2f", params);
    System.out.println(s); // Output is: x is 1.23
  }
}
11 голосов
/ 01 ноября 2009

Вы можете просто передать массив:

public void foo(String... args) {
}

String args[] = new String[10];
foo(args);
8 голосов
/ 03 ноября 2009

Ситуация, которую вы описываете, будет довольно редкой: большую часть времени ваши элементы varargs будут String с, или числами, или Widget с ... для них будет необычно быть Object s (может быть что угодно) или массивы.

Но если аргумент varargs является группой Object с или типом массива, тогда возникает ваш вопрос: вы можете передать ему один массив, и тогда как компилятор узнает, имели ли вы в виду передать массив (тот, который вы предоставили) или последовательность из 1 элемента, который он должен поместить в массив для вас?

Быстрый тест показывает ответ:

public class TestClass {
    public static void main(String[] args) {
        Object anObject = new Object();
        Object[] anArray = new Object[] {anObject, anObject};
        System.out.println("object1 = " + anObject);
        System.out.println("array1 = " + anArray);
        takesArgs();
        takesArgs(anObject, anObject);
        takesArgs(anArray); // is this the same as array1?
        takesArgs(anArray, anArray);
    }

    public static void takesArgs(Object... stuff) {
        System.out.println("The array was " + stuff);
    }
}

Результат выполнения (ваши точные цифры будут разными:

object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1

Таким образом, ответ таков: в неоднозначных случаях он обрабатывает то, что вы передали, как массив, а не создает новый массив для его переноса. Это имеет смысл, поскольку вы всегда можете обернуть его в массив самостоятельно, если вам нужна другая интерпретация.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...