Передача смеси T и T [] в метод Java varargs - PullRequest
2 голосов
/ 13 мая 2010

Предположим, у вас есть метод Java

void foobar(int id, String ... args)

и хотите передать как строковые массивы, так и строки в метод. Как это

String arr1[]={"adas", "adasda"};
String arr2[]={"adas", "adasda"};
foobar(0, "adsa", "asdas");
foobar(1, arr1);
foobar(2, arr1, arr2);
foobar(3, arr1, "asdas", arr2);

В Python для этого есть "*". Есть ли какой-нибудь способ лучше, чем такой довольно уродливый вспомогательный метод:

static String[] concat(Object... args) {
    List<String> result = new ArrayList<String>();
    for (Object arg : args) {
        if (arg instanceof String) {
            String s = (String) arg;
            result.add(s);
        } else if (arg.getClass().isArray() && arg.getClass().getComponentType().equals(String.class)) {
            String arr[] = (String[]) arg;
            for (String s : arr) {
                result.add(s);
            }
        } else {
            throw new RuntimeException();
        }
    }
    return result.toArray(new String[result.size()]);
}

, что позволяет

foobar(4, concat(arr1, "asdas", arr2));

1 Ответ

3 голосов
/ 14 мая 2010

В Java нет встроенного синтаксического сахара для этого, но ваш вспомогательный метод может быть намного лучше:

private static String[] concat(Object... stringOrArrays) {
    List<String> result = new ArrayList<String>();
    for (Object stringOrArray : stringOrArrays) {
        if (stringOrArray instanceof String) {
            result.add((String) stringOrArray);
        } else if (stringOrArray instanceof String[]) {
            Collections.addAll(result, (String[]) stringOrArray);
        } else if (stringOrArray == null) {
            results.add(null)
        } else {
            throw new RuntimeException(stringOrArray + " not a String or String[]");
        }
    }
    return result.toArray(new String[0]);
}

Я мог бы придумать один вкладыш (чтобы избежать метода), но я не рекомендую его:

    foobar(1, new ArrayList<String>() {{
        addAll(Arrays.asList(arr1));
        addAll(Arrays.asList(arr2));
        add(arr3);
    }}.toArray(new String[0]));

Единственное преимущество, которое имеет однострочник, - безопасность типов.

...