Как вызвать метод varargs с дополнительным аргументом из метода varargs

У меня есть некоторая системная функция varargs, где T - некоторый фактический тип, например String:

sys(T... args)

Я хочу создать собственную функцию, которая делегирует системную функцию. Моя функция также является функцией varargs. Я хочу передать все аргументы моей функции через системную функцию плюс дополнительный трейлинг-аргумент. Что-то вроде этого:

myfunc(T... args) {
    T myobj = new T();
    sys(args, myobj); // <- of course, here error.
}

Как мне изменить строку с ошибкой? Теперь я вижу только один способ: создать массив с размером [args] + 1 и скопировать все элементы в новый массив. Но, может быть, существует более простой способ?

Ответы

Ответ 1

Теперь я вижу только один способ: создать массив с размером [args] + 1 и скопировать все элементы в новый массив.

Нет более простого способа. Вам нужно создать новый массив и включить myobj в качестве последнего элемента массива.

String[] args2 = Arrays.copyOf(args, args.length + 1);
args2[args2.length-1] = myobj;
sys(args2);

Если вы зависите от Apache Commons Lang, вы можете сделать

sys(ArrayUtils.add(args, myobj));

или Guava

sys(ObjectArrays.concat(args, myobj));

Ответ 2

Вы можете позвонить sys() дважды, если заказ не волнует:

T myobj=new T();
sys(myobj);
sys(args);

Если вы не можете использовать это, переключитесь на коллекции (например, LinkedList) для всех ваших функций.

Ответ 3

Если вы можете использовать Guava, вы можете сделать:

sys(ObjectArrays.concat(myobj, args))

Ответ 4

Решение Java 8:

sys(Stream.concat(Arrays.stream(args), Stream.of(myobj)).toArray(T[]::new));