Инициализатор двойной строки и массив
У меня есть метод, имеющий параметр массива, например:
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: вы можете видеть, что в грамматике переменная инициализатор является либо выражением ИЛИ (исключительным) инициализатором массива (который не является выражением и, следовательно, не может использоваться при вызове метода).