Argumente bei VarArgs-Methode expandieren



  • Hallo, kurze Frage zu folgendem Code:

    public static void variadic(String... args) {
    	for (String a : args)
    		System.out.println(a);
    }
    
    public static void main(String[] args) {
    	String[] xs = { "second", "third" };
     	// folgendes geht nicht
    	variadic("first", xs);
    }
    

    Ich nehme nicht an, dass es möglich ist, args vor dem Aufruf zu expandieren, sodass ich dessen Argumente einzeln übergebe? Also ähnlich wie der ... -Operator in C++, der ein Pack expandiert.

    Wie würdet ihr das am besten lösen? Was definitiv nicht geht, ist dass der Benutzer jedes Mal manuell ein grosses Array mit selbst errechneter Grösse erstellen muss, die Einzelteile da reinkopiert und dieses übergibt.

    Ich habe an sowas gedacht:

    public static void main(String[] args) {
    	String[] xs = { "second", "third" };
    	variadic(expand("first", xs));
    }
    
    public static String[] expand(Object... args) {
    	List<String> list = new ArrayList<>();
    
    	for (Object a : args) {
    		if (a instanceof String)
    			list.add((String) a);
    		else if (a instanceof String[])
    			list.addAll(Arrays.asList((String[]) a));
    	}
    
    	String[] array = new String[list.size()];
    	return list.toArray(array);
    }
    

    Das funktioniert, aber ich fürchte, dies generisch zu lösen (also für andere Klassen als String ) wird schwierig. Gibts einen Weg ohne massenhaft Reflection?

    (Wie oft hier unnötig kopiert wird, möchte ich mir gar nicht erst ausmalen...)



  • Muss variadic denn völlig flexibel sein, also sowas auch?

    variadic("first", xs, xs2, "last");
    

    Dann hab ich keine Ahnung, aber das wäre ja auch mit expand-Methode nicht machbar.(quatsch)
    Falls nicht und es nur wie in deinem Beispiel sein muss, dann vertausch doch die Argumente

    public static void variadic(String[] arrayArg, String... args) {
    ...
    variadic(xs, "preLast", "last");
    


  • Oder mach doch den instanceof-Krams in die variadic-Metode und als Parameter 'Object... args'.


Anmelden zum Antworten