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

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

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

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

foo(new int[3]);

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

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

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


person Ren lee    schedule 11.03.2015    source источник
comment
Спасибо за комментарий, Страшно. и это именно моя точка зрения. foo ({1, 2, 3}) не работает...   -  person Ren lee    schedule 11.03.2015
comment
foo (new int[] {1, 2, 3}) работает   -  person Eran    schedule 11.03.2015
comment
@Eran Да, но вопрос в том, почему int[] i = {1,2,3}; работает, но не foo({1,2,3});   -  person Subler    schedule 11.03.2015
comment
Действительно ли int[] foo = {1, 2, 3} работает? Не имел представления. Как раз тогда, когда вы думали, что знаете весь синтаксис языка Java..;)   -  person CKing    schedule 11.03.2015
comment
может быть... двойные фигурные скобки VS new - это int x[] = new int[10] вы выделяете 10 местоположений (только длина, без значений), они содержат значение инициализации на основе типа (примитивные типы) или NULL для объектов, однако {1,4,7} будет инициализировать значения + длина или {} будет означать новый массив с length=0   -  person Yazan    schedule 11.03.2015
comment
может быть, потому что {1,2,3} - это не массив, а просто значения инициализации для массива?   -  person Andrei Nikolaenko    schedule 11.03.2015
comment
спасибо Эран. конечно foo (new int[] {1, 2, 3}) работает, но foo ({1, 2, 3}). я хочу сказать, что есть способ создать массив, например new int[3], new int[] {1,2,3} и {1,2,3}, используя оператор new или {}. но когда мы вызываем метод, мы можем использовать только новый оператор. нет {}. я предполагаю, что есть какие-то различия между оператором new и {}, и я хочу это знать.   -  person Ren lee    schedule 11.03.2015
comment
Примечание. Здесь вы показываете не то, что известно как инициализация двойной фигурной скобки. Используйте правильную терминологию, чтобы избежать путаницы.   -  person Jesper    schedule 11.03.2015
comment
Ознакомьтесь с разделом Создание, инициализация и доступ к массиву этой ссылки< /а>.   -  person dbank    schedule 11.03.2015
comment
Foo({3,4,5}) действительно не имеет определенного типа данных. Это будет работать в python, но в java вам нужен тип данных   -  person Zuko    schedule 11.03.2015
comment
Возможно, вы захотите использовать var-args вместо параметра массива: void foo(int...params) и вызвать с помощью foo(1, 2, 3).   -  person Walter Laan    schedule 11.03.2015


Ответы (2)


{} как часть 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, это часть спецификация языка относительно поддерживаемого синтаксиса, который не включает его использование при вызове метода.

person Petesh    schedule 11.03.2015

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

person benzonico    schedule 11.03.2015