2010-12-20 7 views
2

Ich habe eine Methode, die Schlüssel und die zugehörigen Parameter im folgenden Format verwendet.Wie verwenden Sie variable Argumente, um eine bestimmte Funktion um ein Objekt zu wickeln []

public String foo(String key, Object[] parameters) {..} 

Ich würde es vorziehen, die Parameter mit einem variablen Argument Format übergeben. Wie soll ich das machen?

Ich versuchte public String foo(String key, Object... parameters) {..} - Aber dies scheint mit der oben angegebenen Methode Definition kollidieren.

Sollte ich etwas wie das Folgende tun und dies in die Object [] Methode einbinden?

public String foo(String key, Object a) {..} 
public String foo(String key, Object a, Object b) {..}  
public String foo(String key, Object a, Object b, Object c) {..} 

Antwort

6

ändern Sie einfach die Definition der vorhandenen Funktion

public String foo(String key, Object... parameters) {..} 

Der variadische Methode Mechanismus in Java ist syntaktischer Zucker für einen Array an der Aufrufstelle erstellen und übergeben Sie in. Also diese Methode mit bestehenden kompatibel sein sollte Quellcode und kompilierte Klassen.

Von the Java documentation on varargs:

Die drei Perioden nach der Art des letzten Parameters anzuzeigen, dass das letzte Argument kann als Array oder als eine Folge von Argumenten übergeben werden.

+0

+1 Dies ist der entscheidende Punkt ist. –

2

Geben Sie der Methode einen anderen Namen:

public String bar(String key, Object... a) { 
    return foo(key, a); 
} 

Der Name mit dem Original sein schließen sollte, wahrscheinlich der Grund, warum die Angabe es existiert (dies kann aber auch dokumentiert werden). Ich kann nicht spezifischer mit "foo" sein :)

Dies ist natürlich erforderlich, wenn Sie die vorhandene Methodensignatur nicht ändern können, zum Beispiel erben von einer 3rd-Party-Klasse. Wenn Sie es ändern können - ändern Sie es. Alte Aufrufe werden immer noch funktionieren.

2

public String foo(String key, Object[] parameters)public String foo(String key, Object... parameters) und die gleichen Verfahren sind, ist ihre ("Klassendatei") Unterschriften sind äquivalent.

Wenn Sie eine Methode haben wie

public String foo(String key, Object... parameters) {} 

die follwing Anrufe sind erlaubt:

foo("1", obj1); 
foo("2", obj1, obj2); 
foo("3", new Object[]{obj1, obj2, obj3}); 
+0

* "... sind die gleichen Methoden, ihre Unterschriften sind gleichwertig" * Ähm, wirklich? Also kann ich 'public String foo (String key, Object [] Parameter') mit fünf Argumenten aufrufen:' foo ("hi", "does", "this", "wirklich", "work"); '? Scheint unwahrscheinlich. ** Bearbeiten **: Getestet. Nein, du kannst nicht. Sie können nicht beide haben, aber ihre Signaturen sind * nicht * äquivalent. –

+0

@ T.J. Crowder - ja und nein ... auf * byte code level *, die Signaturen sind gleich - der Compiler fügt einfach etwas Kleber hinzu, um aus den Parametern ein 'Object []' zu erzeugen und übergibt dieses an die Methode. Das wollte ich * sagen. –

1

public String foo(String key, Object[] parameters) {..} und

public String foo(String key, Object... parameters) {..} sind gleich

+0

nicht ganz. Der Eclipse-Compiler ruft nicht gerne eine Nicht-Varargsmethode mit Varargs auf. – Bozho

Verwandte Themen