Java varargs: способ вернуться к ...- форме? - PullRequest
0 голосов
/ 23 марта 2011

Полагаю, у вас есть класс с некоторыми c-торами:

public Foo(int i, String s);
public Foo(float fl, String s);
public Foo(String s, Bar b, boolean f);

Теперь, когда у вас есть следующий fn:

public Foo doSomething(Object… args)
{
    /*… do something before … */
    Foo foo = new Foo( ?!? );
    /*… do something after … */
    return foo;
}

Что нужно назвать правильным c-tor?Есть ли способ перевести аргументы обратно в ...- форму?

Ответы [ 4 ]

2 голосов
/ 23 марта 2011

Нет - в конце концов, там могут быть любые ссылки, включая нулевые ссылки.

Вам нужно будет проверить значения, которые вы фактически дали для типов параметров.для сигнатур конструктора.

Я бы расценил это как признак того, что вы, вероятно, не должны использовать varargs в этой ситуации.Вы всегда можете перегружать метод теми же сигнатурами, что и конструкторы, и вызывать общие вспомогательные методы для частей до / после ... или, если время вызова конструктора не имеет значения, сделайте это all в общем методе, кроме конструкции:

public void doSomething(int i, String s)
{
    doSomethingHelper(new Foo(i, s));
}
1 голос
/ 23 марта 2011

Помимо проверки конкретного типа каждого элемента в аргументах, их приведения вручную, а затем вызова надлежащего конструктора с помощью отражения, вы ничего не можете сделать. (И это было бы ужасно, черт возьми ...) Компилятору нужно статически связывать вызовы конструктора, но вы узнаете конкретные параметры только во время выполнения.

Альтернативой может быть предоставление конструктору параметра varargs, но это просто делегирует проблему на один уровень ниже. @ Предложение Джона полностью избавиться от вараггов.

0 голосов
/ 23 марта 2011

Обратите внимание, что Object... на самом деле просто синтаксический сахар для Object[].Таким образом, у вас есть те же опции, что и при типе параметра Object[].

.
0 голосов
/ 23 марта 2011

Вы, конечно, можете проверить количество и тип аргументов и соответственно отправить их. Но обратите внимание на мой комментарий выше.

...