Ich möchte eine Funktion erstellen können wie:
class A {
private String extraVar;
public String myFormat(String format, Object ... args){
return String.format(format, extraVar, args);
}
}
Das Problem hierbei ist , dass args
so behandelt wird , Object[]
in dem Verfahren myFormat
, und ist somit ein einziges Argument String.format
, während ich jedes einzelne möchte Object
in args
als neues Argument übergeben werden. Da String.format
es sich auch um eine Methode mit variablen Argumenten handelt, sollte dies möglich sein.
Wenn dies nicht möglich ist, gibt es eine Methode wie String.format(String format, Object[] args)
? In diesem Fall könnte ich extraVar
der args
Verwendung eines neuen Arrays voranstellen und es an diese Methode übergeben.
java
arrays
backwards-compatibility
variadic-functions
user362382
quelle
quelle
Antworten:
Der zugrunde liegende Typ einer variadischen Methode
function(Object... args)
istfunction(Object[] args)
. Sun fügte auf diese Weise Varargs hinzu, um die Abwärtskompatibilität zu gewährleisten.So sollten Sie nur in der Lage sein , vorangestellt
extraVar
zuargs
und AnrufString.format(format, args)
.quelle
X[]
an eine Methode übergeben,x(X... xs)
wird in Eclipse die folgende Warnung ausgegeben: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.
Ja, a
T...
ist nur ein syntaktischer Zucker für aT[]
.JLS 8.4.1 Formatparameter
Hier ist ein Beispiel zur Veranschaulichung:
Und ja, die obige
main
Methode ist gültig, weil sie wiederString...
gerecht istString[]
. Da Arrays kovariant sind,String[]
ist a auch einObject[]
, sodass Sie auch inezFormat(args)
beide Richtungen aufrufen können.Siehe auch
Varargs Fallstricke # 1: vorbei
null
Wie Varargs gelöst werden, ist ziemlich kompliziert und manchmal macht es Dinge, die Sie überraschen können.
Betrachten Sie dieses Beispiel:
Aufgrund wie varargs aufgelöst werden, die letzte Anweisung ruft mit
objs = null
, was natürlich dazu führen würde ,NullPointerException
mitobjs.length
. Wenn Sienull
einem varargs-Parameter ein Argument geben möchten, haben Sie folgende Möglichkeiten:Verwandte Fragen
Das Folgende ist ein Beispiel für einige der Fragen, die Menschen beim Umgang mit Varargs gestellt haben:
Vararg Fallstricke # 2: Hinzufügen zusätzlicher Argumente
Wie Sie herausgefunden haben, "funktioniert" Folgendes nicht:
Aufgrund der Funktionsweise von varargs werden
ezFormat
tatsächlich zwei Argumente angezeigt , von denen das erste aString[]
und das zweite a istString
. Wenn Sie ein Array an varargs übergeben und möchten, dass seine Elemente als einzelne Argumente erkannt werden, und Sie auch ein zusätzliches Argument hinzufügen müssen, haben Sie keine andere Wahl, als ein anderes Array zu erstellen , das das zusätzliche Element enthält.Hier sind einige nützliche Hilfsmethoden:
Jetzt können Sie Folgendes tun:
Varargs Fallstricke # 3: Übergeben einer Reihe von Grundelementen
Es "funktioniert" nicht:
Varargs funktioniert nur mit Referenztypen. Autoboxing gilt nicht für eine Reihe von Grundelementen. Folgendes funktioniert:
quelle
X[]
an eine Methode übergeben,x(X... xs)
wird in Eclipse die folgende Warnung ausgegeben: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.
Es ist in Ordnung, ein Array zu übergeben - tatsächlich ist es dasselbe
ist das gleiche wie
Es ist nur syntaktischer Zucker - der Compiler konvertiert den ersten in den zweiten, da die zugrunde liegende Methode ein Array für den vararg- Parameter erwartet .
Sehen
quelle
jasonmp85 hat Recht, ein anderes Array an zu übergeben
String.format
. Die Größe eines Arrays kann nach dem Erstellen nicht mehr geändert werden. Sie müssen also ein neues Array übergeben, anstatt das vorhandene zu ändern.quelle
Ich hatte das gleiche Problem.
Und dann das obj als varargs Argument übergeben. Es funktionierte.
quelle