Я хотел бы иметь возможность создать функцию, такую как:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Проблема здесь заключается в том , что args
рассматривается как Object[]
в способе myFormat
, и , таким образом , является единственным аргументом String.format
, в то время как я хотел бы каждый Object
в args
будет принят в качестве нового аргумента. Поскольку String.format
это также метод с переменными аргументами, это должно быть возможно.
Если это невозможно, есть ли такой метод String.format(String format, Object[] args)
? В этом случае я мог extraVar
бы args
использовать новый массив и передать его этому методу.
java
arrays
backwards-compatibility
variadic-functions
user362382
источник
источник
Ответы:
Основным типом метода вариации
function(Object... args)
являетсяfunction(Object[] args)
. Sun добавила varargs таким образом, чтобы сохранить обратную совместимость.Таким образом , вы просто должны быть в состоянии предварять
extraVar
кargs
и вызовString.format(format, args)
.источник
X[]
в методx(X... xs)
дает следующее предупреждение в Eclipse:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation.
Да, это
T...
только синтаксический сахар дляT[]
.JLS 8.4.1 Параметры формата
Вот пример для иллюстрации:
И да, приведенный выше
main
метод действителен, потому что опять-такиString...
справедливString[]
. Кроме того, поскольку массивы являются ковариантными, aString[]
- это aObject[]
, поэтому вы также можете вызывать вezFormat(args)
любом случае.Смотрите также
Varargs Gotchas # 1: прохождение
null
Как решить varargs довольно сложно, и иногда это делает вещи, которые могут вас удивить.
Рассмотрим этот пример:
Из-за того, как решаются varargs, последний оператор вызывается с
objs = null
, что, конечно, вызвало быNullPointerException
сobjs.length
. Если вы хотите дать одинnull
аргумент параметру varargs, вы можете сделать одно из следующих:Смежные вопросы
Ниже приведен пример некоторых вопросов, которые люди задавали при работе с varargs:
Vararg Gotchas # 2: добавление дополнительных аргументов
Как вы узнали, следующее не «работает»:
Из-за того, как работает varargs,
ezFormat
фактически получает 2 аргумента, первый - aString[]
, второй - aString
. Если вы передаете массив в varargs и хотите, чтобы его элементы распознавались как отдельные аргументы, и вам также необходимо добавить дополнительный аргумент, у вас нет другого выбора, кроме как создать другой массив, который будет содержать дополнительный элемент.Вот несколько полезных вспомогательных методов:
Теперь вы можете сделать следующее:
Varargs получил # 3: передавая массив примитивов
Это не "работает":
Varargs работает только со ссылочными типами. Автобокс не применяется к массиву примитивов. Следующие работы:
источник
X[]
в методx(X... xs)
дает следующее предупреждение в Eclipse:Type X[] of the last argument to method x(X...) doesn't exactly match the vararg parameter type. Cast to X[] to confirm the non-varargs invocation, or pass individual arguments of type X for a varargs invocation.
Можно передать массив - фактически это одно и то же
такой же как
Это просто синтаксический сахар - компилятор преобразует первый во второй, поскольку базовый метод ожидает массив для параметра vararg .
Видеть
источник
jasonmp85 прав насчет передачи другого массива в
String.format
. Размер массива нельзя изменить после его создания, поэтому вам придется передавать новый массив вместо изменения существующего.источник
У меня была такая же проблема.
А затем передал объект в качестве аргумента varargs. Это сработало.
источник