Инициализатор двойной строки и массив

У меня есть метод, имеющий параметр массива, например:

public static void foo(int[] param) {
    // Some code
}

А также я могу вызвать метод, написав как

foo(new int[3]);

Обычно мы объявляем и инициализируем массив с помощью нового оператора или инициализатора двойной фигурной скобки, например {1, 2, 3}. Например, int[] foo = new int[3]; или int[] foo = {1, 2, 3};.

Но невозможно использовать инициализатор двойной комбинации в качестве параметра для метода. {} доступен только для создания объекта массива.

И вот мой вопрос: существуют ли различия между новым оператором и {}? Если есть, что это такое?

Ответ 1

{} как часть int foo[] = {1, 2, 3}; - это то, что называется инициализацией скобки, и является ярлыком для int foo[] = new int[]{1, 2, 3};, потому что new int[] можно вывести из левой стороны.

Во втором случае foo({1, 2, 3}); никакой вывод о том, что вы намереваетесь, можно определить, поскольку нет намека на то, что означает {1, 2, 3}, поэтому компилятор жалуется.

Когда вы переписываете его как foo(new int[]{1, 2, 3});, вы сообщаете компилятору, что означает элемент в {}.

Компилятор не будет (и не пытается) автоматически интерпретировать выражение {} до его совпадения - это приведет к потенциальным неоднозначностям.

Существует также этот вопрос, который, по-видимому, охватывает точно такую ​​же основу.

Как упоминалось @benzonico, он является частью спецификации языка поскольку это является поддерживаемым синтаксисом, который не включает его используется при вызове метода.

Ответ 2

Чтобы закончить другой ответ, вы можете посмотреть JLS 8 10.6: вы можете видеть, что в грамматике переменная инициализатор является либо выражением ИЛИ (исключительным) инициализатором массива (который не является выражением и, следовательно, не может использоваться при вызове метода).