web-dev-qa-db-fra.com

différence fn (String ... args) vs fn (String [] args)

Quelle est cette syntaxe utile pour:

    function(String... args)

Est-ce la même chose que d'écrire

    function(String[] args) 

avec différence uniquement en invoquant cette méthode ou y a-t-il une autre fonctionnalité impliquée avec elle?

62
Nrj

La seule différence entre les deux est la façon dont vous appelez la fonction. Avec String var args, vous pouvez omettre la création du tableau.

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);
    }
}
85
bruno conde

La différence n'est que lors de l'appel de la méthode. Le second formulaire doit être invoqué avec un tableau, le premier formulaire peut être invoqué avec un tableau (tout comme le second, oui, cela est valide selon Java standard) ou avec une liste de des chaînes (plusieurs chaînes séparées par une virgule) ou sans aucun argument (la seconde doit toujours en avoir une, au moins null doit être passé).

C'est du sucre syntaxiquement. En fait, le compilateur tourne

function(s1, s2, s3);

dans

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

intérieurement.

20
Mecki

avec varargs (String...) vous pouvez appeler la méthode de cette façon:

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

Vous ne pouvez pas faire cela avec array (String[])

11
michelemarcon

Vous appelez la première fonction comme:

function(arg1, arg2, arg3);

tandis que le second:

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

Sur la taille du récepteur, vous obtiendrez un tableau de String. La différence ne concerne que le côté appelant.

6
JesperE
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);
        }
    }
}
2
kamal