Подтвердить что ты не робот

Varargs и аргумент '...'

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

String.format(String, Object ...)

Аргумент Object ... - это просто ссылка на массив Object s. Есть ли способ использовать этот метод со ссылкой на фактический массив 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.

Строка жирная - это реальный вопрос.
Это второй вопрос: Имеет ли массив/параметр ... имя?

4b9b3361

Ответ 1

Из docs на 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
  }
}

Ответ 2

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

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

String args[] = new String[10];
foo(args);

Ответ 3

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

Но если аргумент 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 = [email protected]
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

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