Передача массива в качестве аргумента в форме {}

Я могу установить такой массив:

Object[] objects = {new Object()};

Однако, если у меня есть метод:

public void setObject(Object[] objects) {

}

Я не могу сделать следующее:

setObject({new Object()});

Почему это? Почему {new Object()} недостаточно в качестве аргумента, но достаточно для инициализации массива Object[]?


person Luke Taylor    schedule 22.05.2013    source источник


Ответы (4)


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

setObject(new Object[] { new Object() });

Обратите внимание, что синтаксис { new Object() } работает только при инициализации массива при его объявлении. Например:

Object[] arr = { new Object() };

Это не работает после объявления массива:

Object[] arr;
//uncomment below line and you'll get a compiler error
//arr = { new Object() };
arr = new Object[] { new Object() };
person Luiggi Mendoza    schedule 22.05.2013
comment
Хех, я только что решил эту проблему на прошлой неделе и придумал почти такое же решение. Я знаю, является ли это «идеальным» ответом, но я могу заверить вас, что он работает нормально. - person WPrecht; 22.05.2013

Потому что вы не ввели массив. Это могут быть объекты, целые числа, что угодно.

Следующее должно работать:

setObject(new Object[]{new Object()});
person Taylor    schedule 22.05.2013

Правильный обратный вызов:

setObject(new Object[]{new Object()});
person Konstantin Yovkov    schedule 22.05.2013

Каждый массив Java имеет тип компонента. При использовании в инициализаторе компилятор делает вывод, что тип нового массива (правая часть) совпадает с объявленным типом (левая часть).

Когда объявление отсутствует, компилятор не знает, каким должен быть тип компонента массива. Вы должны быть явными, используя выражение setObject(new Object[] { new Object() })

Может возникнуть вопрос, почему компилятор не выводит тип из объявленного типа параметра метода, как это происходит при инициализации переменной. Но компилятор разрешает вызываемый метод на основе типов параметров; если вы не знаете метод, который вызываете, вы ничего не сможете сделать из его типов параметров. При инициализации переменной цикличности нет.

person erickson    schedule 22.05.2013