J'aimerais pouvoir créer une fonction comme:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Le problème ici est que l' args
on traite comme Object[]
dans la méthode myFormat
, et est donc un seul argument String.format
, alors que je voudrais chaque Object
à args
être passé comme un nouvel argument. Puisqu'il String.format
s'agit également d'une méthode avec des arguments variables, cela devrait être possible.
Si ce n'est pas possible, existe-t-il une méthode comme String.format(String format, Object[] args)
? Dans ce cas, je pourrais ajouter extraVar
à l' args
aide d'un nouveau tableau et le transmettre à cette méthode.
java
arrays
backwards-compatibility
variadic-functions
user362382
la source
la source
Réponses:
Le type sous-jacent d'une méthode variadique
function(Object... args)
estfunction(Object[] args)
. Sun a ajouté des varargs de cette manière pour préserver la compatibilité descendante.Donc , vous devriez juste être en mesure de préfixer
extraVar
àargs
et appelString.format(format, args)
.la source
X[]
dans une méthodex(X... xs)
donne l'avertissement suivant dans 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.
Oui, a
T...
n'est qu'un sucre syntaxique pour aT[]
.Paramètres de format JLS 8.4.1
Voici un exemple pour illustrer:
Et oui, la
main
méthode ci-dessus est valide, car encore une fois, elleString...
est justeString[]
. De plus, comme les tableaux sont covariants, aString[]
est unObject[]
, vous pouvez donc également appeler dans lesezFormat(args)
deux sens.Voir également
Varargs gotchas # 1: en passant
null
La façon dont les varargs sont résolus est assez compliquée, et parfois cela fait des choses qui peuvent vous surprendre.
Considérez cet exemple:
En raison de la façon dont les varargs sont résolus, la dernière instruction invoque avec
objs = null
, ce qui bien sûr entraîneraitNullPointerException
avecobjs.length
. Si vous souhaitez donner unnull
argument à un paramètre varargs, vous pouvez effectuer l'une des opérations suivantes:Questions connexes
Voici un exemple de certaines des questions que les gens ont posées lorsqu'ils ont traité des varargs:
Vararg gotchas # 2: ajout d'arguments supplémentaires
Comme vous l'avez découvert, les éléments suivants ne "fonctionnent" pas:
En raison de la façon dont varargs fonctionne,
ezFormat
obtient en fait 2 arguments, le premier étant unString[]
, le second étant unString
. Si vous passez un tableau à varargs, et que vous souhaitez que ses éléments soient reconnus comme des arguments individuels, et que vous devez également ajouter un argument supplémentaire, vous n'avez pas d'autre choix que de créer un autre tableau qui accueille l'élément supplémentaire.Voici quelques méthodes d'aide utiles:
Vous pouvez maintenant effectuer les opérations suivantes:
Varargs gotchas # 3: passage d'un tableau de primitives
Ça ne "marche" pas:
Varargs ne fonctionne qu'avec des types de référence. Le contrôle automatique ne s'applique pas au tableau de primitives. Les oeuvres suivantes:
la source
X[]
dans une méthodex(X... xs)
donne l'avertissement suivant dans 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.
C'est correct de passer un tableau - en fait, cela revient à la même chose
est le même que
C'est juste du sucre syntaxique - le compilateur convertit le premier en deuxième, car la méthode sous-jacente attend un tableau pour le paramètre vararg .
Voir
la source
jasonmp85 a raison de passer un tableau différent à
String.format
. La taille d'un tableau ne peut pas être modifiée une fois construit, vous devez donc passer un nouveau tableau au lieu de modifier celui existant.la source
J'avais le même problème.
Et puis passé l'obj comme argument varargs. Ça a marché.
la source