47 votes

varargs et l'argument '...'

Examiner la déclaration de la méthode:

String.format(String, Object ...)

L' Object ... argument est juste une référence à un tableau d' Objects. Est-il possible d'utiliser cette méthode avec une référence à un réel Object tableau? Si je passe dans un Object tableau à l' ... de l'argument sera la résultante de la valeur de l'argument un tableau à deux dimensions, car Object[] est lui-même un Object:

Object[] params = ....; // Make the array (for example based on user-input)
String s = String.format("%S has %.2f euros", params);

De sorte que le premier élément du tableau (Qui est utilisé dans l' String.format méthode), sera un tableau et il va générer:

[class.getName() + "@" + Integer.toHexString(hashCode())] 

et puis une erreur, car la taille de la matrice est 1.

J'espère avoir bien expliqué. Probablement beaucoup de la grammaire des fautes (14 ans et néerlandophone), alors pardonnez-moi.

Le gras de la séquence est la vraie question.
C'est une deuxième question: un ... tableau/paramètre un nom?

53voto

Ayman Hourieh Points 39435

De la docs sur varargs :

Les trois points après le type du paramètre final indiquent que l'argument final peut être transmis sous forme de tableau ou de séquence d'arguments.

Donc, vous pouvez passer plusieurs arguments ou un tableau.

Ce qui suit fonctionne très bien:

 class VarargTest {
  public static void main(String[] args) {
    Object[] params = {"x", 1.2345f};
    String s = String.format("%s is %.2f", params);
    System.out.println(s); // Output is: x is 1.23
  }
}
 

10voto

cletus Points 276888

Vous pouvez simplement passer un tableau:

 public void foo(String... args) {
}

String args[] = new String[10];
foo(args);
 

8voto

mcherm Points 5209

La situation que vous décrivez va être assez rare: la plupart du temps, votre varargs éléments sera Strings, ou des chiffres, ou Widgets... il sera inhabituel pour eux de s' Objects (qui pourrait être n'importe quoi) ou des tableaux.

Mais si les varargs argument est un tas de Objects ou un type tableau, votre question ne se posent: vous pouvez passer un tableau unique et ensuite comment le compilateur de savoir si vous avez voulu passer un tableau (celui que vous avez fourni), ou une série de 1 élément dont il doit les METTRE dans un tableau pour vous?

Un test rapide montre la réponse:

public class TestClass {
    public static void main(String[] args) {
        Object anObject = new Object();
        Object[] anArray = new Object[] {anObject, anObject};
        System.out.println("object1 = " + anObject);
        System.out.println("array1 = " + anArray);
        takesArgs();
        takesArgs(anObject, anObject);
        takesArgs(anArray); // is this the same as array1?
        takesArgs(anArray, anArray);
    }

    public static void takesArgs(Object... stuff) {
        System.out.println("The array was " + stuff);
    }
}

Le résultat de l'exécution (vos chiffres exacts varient:

object1 = java.lang.Object@3e25a5
array1 = [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@addbf1
The array was [Ljava.lang.Object;@42e816
The array was [Ljava.lang.Object;@19821f
The array was [Ljava.lang.Object;@9304b1

La réponse est donc que dans le cas ambigu, il traite de ce que vous avez passé dans le tableau au lieu de créer un nouveau tableau pour l'envelopper. Cela a un sens, comme vous pouvez l'envelopper dans un tableau vous-même si vous vouliez l'autre interprétation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X