Eu gostaria de poder criar uma função como:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
O problema aqui é que args
é tratado como Object[]
no método myFormat
, e, portanto, é um único argumento para String.format
, enquanto eu gostaria cada Object
no args
a ser passado como um novo argumento. Como String.format
também é um método com argumentos variáveis, isso deve ser possível.
Se isso não for possível, existe um método como String.format(String format, Object[] args)
? Nesse caso, eu poderia começar extraVar
a args
usar uma nova matriz e passá-la para esse método.
java
arrays
backwards-compatibility
variadic-functions
user362382
fonte
fonte
Respostas:
O tipo subjacente de um método variadic
function(Object... args)
éfunction(Object[] args)
. A Sun adicionou varargs dessa maneira para preservar a compatibilidade com versões anteriores.Portanto, você deve apenas ser capaz de preceder
extraVar
aargs
e chamadaString.format(format, args)
.fonte
X[]
para um métodox(X... xs)
gera o seguinte aviso no 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.
Sim, a
T...
é apenas um açúcar sintático para aT[]
.Parâmetros de formato JLS 8.4.1
Aqui está um exemplo para ilustrar:
E sim, o acima
main
método é válido, porque, novamente,String...
é justoString[]
. Além disso, como as matrizes são covariantes, aString[]
é umaObject[]
, então você também pode chamar deezFormat(args)
qualquer maneira.Veja também
Dicas Varargs # 1: passagem
null
Como os varargs são resolvidos é bastante complicado e, às vezes, faz coisas que podem surpreendê-lo.
Considere este exemplo:
Devido à forma como varargs são resolvidos, os últimos invoca declaração com
objs = null
, o que naturalmente causariamNullPointerException
comobjs.length
. Se você deseja atribuir umnull
argumento a um parâmetro varargs, pode fazer o seguinte:Perguntas relacionadas
A seguir, é apresentado um exemplo de algumas das perguntas que as pessoas fizeram ao lidar com varargs:
Vararg dicas # 2: adicionando argumentos extras
Como você descobriu, o seguinte não "funciona":
Devido à maneira como os varargs funcionam,
ezFormat
na verdade obtém 2 argumentos, sendo o primeiro aString[]
, o segundo sendo aString
. Se você estiver passando uma matriz para varargs e quiser que seus elementos sejam reconhecidos como argumentos individuais, e também precisar adicionar um argumento extra, não terá outra opção a não ser criar outra matriz que acomode o elemento extra.Aqui estão alguns métodos auxiliares úteis:
Agora você pode fazer o seguinte:
Dicas de Varargs # 3: passando uma matriz de primitivas
Não "funciona":
Varargs funciona apenas com tipos de referência. A caixa automática não se aplica à matriz de primitivas. Os seguintes trabalhos:
fonte
X[]
para um métodox(X... xs)
gera o seguinte aviso no 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.
Não há problema em passar uma matriz - na verdade, é a mesma coisa
é o mesmo que
É apenas açúcar sintático - o compilador converte o primeiro no segundo, já que o método subjacente espera uma matriz para o parâmetro vararg .
Vejo
fonte
jasonmp85 está certo em passar uma matriz diferente para
String.format
. O tamanho de uma matriz não pode ser alterado uma vez construído, então você precisa passar uma nova matriz em vez de modificar a existente.fonte
Eu estava tendo o mesmo problema.
E depois passou o obj como argumento varargs. Funcionou.
fonte