Как вызвать метод 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));