разница fn (String ... args) и fn (String [] args) - PullRequest
59 голосов
/ 19 ноября 2008

Для чего этот синтаксис полезен:

    function(String... args)

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

    function(String[] args) 

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

Ответы [ 6 ]

84 голосов
/ 19 ноября 2008

Единственная разница между ними заключается в способе вызова функции. С помощью 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);
    }
}
20 голосов
/ 19 ноября 2008

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

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

function(s1, s2, s3);

в

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

внутри.

10 голосов
/ 19 ноября 2008

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

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

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

7 голосов
/ 19 ноября 2008

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

function(arg1, arg2, arg3);

, а второй:

String [] args = new String[3];
args[0] = "";
args[1] = "";
args[2] = "";
function(args);
6 голосов
/ 19 ноября 2008

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

2 голосов
/ 09 августа 2010
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);
        }
    }
}
...