2015-04-08 5 views
-3

У меня возник вопрос относительно ... параметров в java. Вот пример кодаИспользование ... параметров в Java

class Foo{ 

    private void m1(Object... params){ 
     //do something with params[0] 
     //do something with params[1] 
     //do something with params[2] 
     //do something with params[3] 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     m1(additionalParam, params); 
    } 

} 
class Example{ 

    public void main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(o1, o2, o3); 
    } 
} 

Что-то вроде этой работы? Я не получил ошибку компилятора, но при выполнении чего-то подобного у меня были проблемы при изменении значения одного из объектов с m1().


РЕШЕНИЕ: Я думал, что массив будет сплющенные, но, по-видимому, не произойдет.

class Foo{ 

    private void m1(Object... params){ 
     //do something with params[0] 
     //do something with params[1][0] 
     //do something with params[1][1] 
     //do something with params[1][2] 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     m1(additionalParam, params); 
    } 

} 
class Example{ 

    public void main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(o1, o2, o3); 
    } 
} 

Спасибо, Сиббо за ваш вклад.

+0

В чем проблема? –

+3

не будет m2 приводить к бесконечному регрессу, из-за которого он многократно называет себя все большим количеством аргументов? –

+0

Какие проблемы? Пожалуйста, объясните больше. – Maroun

ответ

1

Вы передаете два аргумента m1. Один из них - Object (A), один - Object[] (B). Для доступа к A вы можете использовать params[0], но для доступа к любому элементу i из B вам необходимо использовать params[1][i].

Итак, если вы ожидали, что результирующий массив будет сплющен, нет, его не будет.

Если вы хотите изменить значения, которые хранятся в массиве, который вы передаете в методе main, просто сделайте это так, как вы делали в своем втором примере. Если вы хотите сделать это красиво, используйте правильные типы вместо Object.

+0

Я действительно узнал, что это была одна из проблем, хотя это не решение. Спасибо в любом случае –

+0

Что вы спрашиваете? – Sibbo

+0

Другой ответ - мое решение, хотя я не могу принять его еще на 5 минут: P –

0

Параметр (TYPE ... NAME) просто говорит: «Передайте несколько объектов типа TYPE». Затем их можно будет регулярно обращаться через NAME [x], где x - индекс объекта, в котором вы проходили.

EDIT: Вторая часть моего ответа была неправильной. Извините за любую путаницу.

+0

Объекты не копируются. Java передает объекты по ссылке. – Sibbo

+0

Вы ошибаетесь частично, java создает копию, которая является истинной, но не самой объектной, она создает копию ссылочного значения, которое в конце ссылается на сам объект. – SomeJavaGuy

+0

@KevinEsche Ссылается ли ссылка на переменную или ссылается на ее значение? –

0

Параметры Varargs обрабатываются компилятором как массив. Поэтому ваш пример должен выглядеть следующим образом:

class Foo{ 

    private void m1(Object... params){ 
     //do something 
    } 

    public void m2(Object... params){ 
     Object additionalParam = new Object(); 
     Object[] newArray = /* Here you need to create an array with all param elements and the new one*/ 
     m2(newArray); 
    } 

} 
class Example{ 

    public int main(String[] args){ 
     Foo f = new Foo(); 
     Object o1 = new Object(); 
     Object o2 = new Object(); 
     Object o3 = new Object(); 
     f.m2(new Object[]{o1, o2, o3}); 
    } 
} 
+0

Умм, вы знаете разницу между Object ... и Object [], правильно? –

+1

«Разница» здесь не правильное слово. Varargs («...») позволяет передавать любое количество объектов в качестве заданного параметра, так что null, 0, один или массив. Какой бы вы ни проходили, в коде метода он будет рассматриваться как массив (который является ни пустым, ни пустым, имеет только индекс 0 и т. Д.) – Kelevandos

+0

Пожалуйста, отметьте ответ как решение, если оно поможет. Спасибо :-) – Kelevandos

Смежные вопросы