2012-02-13 2 views
4

Если у меня есть метод public void foo(Object... x), я могу назвать это таким образом:Наиболее читаемый способ для добавления элементов в Java vararg вызова

Object[] bar = ...; 
foo(bar); 

Однако, это не работает:

Object baz = ...; 
Object[] bar = ...; 
foo(baz, bar); 

Очевидно, это можно сделать, создав массив размером 1 больше bar и скопировав baz и содержимое bar. Но есть ли еще более читаемый ярлык?

+0

Возможный дубликат [Как вызвать метод varargs с дополнительным аргументом из метода varargs] (http://stackoverflow.com/questions/27293989/how-to-call-a-varargs-method-with-an -additional-argument-from-a-varargs-method) – Raedwald

+0

@Raedwald От http://meta.stackoverflow.com/questions/286720/old-own-question-flagged-as-duplicated-of-new-own-question : «Это совершенно приемлемо для того, чтобы более старый вопрос был закрыт как дубликат более нового, если у более новых ответов есть лучшие ответы, чем у старшего». Я не думаю, что ответы там лучше. –

ответ

5

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

+0

Хорошая точка при использовании Guava, хотя я бы хотел, чтобы методы 'concat (...)' предоставляют параметры varargs. :) – Thomas

+0

Я считаю, что 'concat (T [], T [], класс )' самый близкий тип безопасный вариант. –

+0

В частности, поскольку generics и varargs не хорошо сочетаются в Java 6 (которые Guava все еще нацеливает), это неудобно. Я думаю, что это должно быть достаточно безопасным в Java 7, чтобы комментировать такой метод с помощью @SafeVarargs, но пока не совсем безопасно говорить. –

1

Возможность будет перегружать foo():

public void foo(Object... x) {} 
public void foo(Object[] a, Object... x) {} 
3

К сожалению, не вне коробки способ сделать это более удобным для чтения.

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

Что-то вроде этого:

public T[] append(T[] originalArray, T... additionalElements) { ... } 

foo(append(bar, baz)); 
+0

Умный; и я не согласен с тем, что «нет готового способа сделать более читаемым» - вы только что сделали! :) –

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