Разница fn(String... args) и fn(String[] args)

Что этот синтаксис полезен для:

    function(String... args)

Это то же самое, что писать

    function(String[] args) 

с разницей только при вызове этого метода или есть какая-то другая функция, связанная с ним?

6 ответов

Решение

Единственная разница между ними заключается в том, как вы вызываете функцию. С помощью String var args вы можете опустить создание массива.

public static void main(String[] args) {
    callMe1(new String[] {"a", "b", "c"});
    callMe2("a", "b", "c");
    // You can also do this
    // callMe2(new String[] {"a", "b", "c"});
}
public static void callMe1(String[] args) {
    System.out.println(args.getClass() == String[].class);
    for (String s : args) {
        System.out.println(s);
    }
}
public static void callMe2(String... args) {
    System.out.println(args.getClass() == String[].class);
    for (String s : args) {
        System.out.println(s);
    }
}

Разница только в вызове метода. Вторая форма должна быть вызвана с массивом, первая форма может быть вызвана с массивом (точно так же как вторая, да, это действует в соответствии со стандартом Java) или со списком строк (несколько строк, разделенных запятой) или без аргументов вообще (второй всегда должен иметь один, по крайней мере, ноль должен быть передан).

Это синтаксически сахар. На самом деле компилятор крутится

function(s1, s2, s3);

в

function(new String[] { s1, s2, s3 });

внутренне.

С варагс (String...) вы можете вызвать метод следующим образом:

function(arg1);
function(arg1, arg2);
function(arg1, arg2, arg3);

Вы не можете сделать это с массивом (String[])

Вы вызываете первую функцию как:

function(arg1, arg2, arg3);

в то время как второй:

String [] args = new String[3];
args[0] = "";
args[1] = "";
args[2] = "";
function(args);

По размеру получателя вы получите массив String. Разница только в вызывающей стороне.

class  StringArray1
{
    public static void main(String[] args) {
        callMe1(new String[] {"a", "b", "c"});
        callMe2(1,"a", "b", "c");
    callMe2(2);
        // You can also do this
        // callMe2(3, new String[] {"a", "b", "c"});
}
public static void callMe1(String[] args) {
        System.out.println(args.getClass() == String[].class);
        for (String s : args) {
            System.out.println(s);
        }
    }
    public static void callMe2(int i,String... args) {
        System.out.println(args.getClass() == String[].class);
        for (String s : args) {
            System.out.println(s);
        }
    }
}
Другие вопросы по тегам