Me gustaría poder crear una función como:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
El problema aquí es que args
se trata como Object[]
en el método myFormat
, y por lo tanto es un solo argumento a String.format
, mientras que me gustaría cada Object
en el args
que se pasa como un nuevo argumento. Como String.format
también es un método con argumentos variables, esto debería ser posible.
Si esto no es posible, ¿hay algún método como String.format(String format, Object[] args)
? En ese caso pude anteponer extraVar
a args
usar una nueva matriz y pasarlo a ese método.
java
arrays
backwards-compatibility
variadic-functions
usuario362382
fuente
fuente
Respuestas:
El tipo subyacente de un método variadic
function(Object... args)
esfunction(Object[] args)
. Sun agregó varargs de esta manera para preservar la compatibilidad con versiones anteriores.Por lo que sólo debe ser capaz de anteponer
extraVar
aargs
y llamadaString.format(format, args)
.fuente
X[]
a un métodox(X... xs)
da la siguiente advertencia en 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.
Sí, a
T...
es solo un azúcar sintáctico para aT[]
.Parámetros de formato JLS 8.4.1
Aquí hay un ejemplo para ilustrar:
Y sí, el
main
método anterior es válido, porque de nuevo,String...
es justoString[]
. Además, debido a que las matrices son covariantes, aString[]
es anObject[]
, por lo que también puede llamar deezFormat(args)
cualquier manera.Ver también
Varargs gotchas # 1: pasando
null
Cómo se resuelven los varargs es bastante complicado, y a veces hace cosas que pueden sorprenderlo.
Considere este ejemplo:
Debido a cómo se resuelven los varargs, la última instrucción invoca con
objs = null
, lo que por supuesto causaríaNullPointerException
conobjs.length
. Si desea dar unnull
argumento a un parámetro varargs, puede hacer lo siguiente:Preguntas relacionadas
La siguiente es una muestra de algunas de las preguntas que las personas han formulado al tratar con varargs:
Vararg gotchas # 2: agregar argumentos adicionales
Como descubrió, lo siguiente no "funciona":
Debido a la forma en que funcionan los varargs, en
ezFormat
realidad obtiene 2 argumentos, el primero es aString[]
, el segundo es aString
. Si está pasando una matriz a varargs, y desea que sus elementos sean reconocidos como argumentos individuales, y también necesita agregar un argumento adicional, entonces no tiene más remedio que crear otra matriz que acomode el elemento adicional.Aquí hay algunos métodos de ayuda útiles:
Ahora puedes hacer lo siguiente:
Varargs gotchas # 3: pasar una serie de primitivas
No "funciona":
Varargs solo funciona con tipos de referencia. Autoboxing no se aplica a la matriz de primitivas. Los siguientes trabajos:
fuente
X[]
a un métodox(X... xs)
da la siguiente advertencia en 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.
Está bien pasar una matriz; de hecho, equivale a lo mismo
es lo mismo que
Es solo azúcar sintáctico: el compilador convierte el primero en el segundo, ya que el método subyacente espera una matriz para el parámetro vararg .
Ver
fuente
jasonmp85 tiene razón al pasar una matriz diferente a
String.format
. El tamaño de una matriz no se puede cambiar una vez construido, por lo que tendría que pasar una nueva matriz en lugar de modificar la existente.fuente
Estaba teniendo el mismo problema.
Y luego pasó el obj como argumento varargs. Funcionó.
fuente