Question

J'ai essayé de transmettre une liste d'initialisation {...} à un constructeur et cela n'a pas fonctionné. Lorsque, au lieu de cela, je l'ai déclarée dans une méthode de variable locale (int []), cela a fonctionné parfaitement.

Pourquoi est-ce?

public class QuickSort {
    int[] a;

    public QuickSort(int[] a) {
        this.a = a;
    }

    public static void main(String[] args) {
        // ###################
        // ###    WORKS     ##
        // ###################
        int[] a = {8,12,79,12,50,44,8,0,7,289,1};
        QuickSort sort = new QuickSort(a);

        // ###################
        // ### DOESN'T WORK ##
        // ###################
        //QuickSort sort = new QuickSort({8,12,79,12,50,44,8,0,7,289,1});
    }
}
Était-ce utile?

La solution

Lors de la déclaration d'un int [] et de l'attribution de {1, 2, 3} , le compilateur sait que vous souhaitez créer un int [] . comme il est précisé ici.

Dans le dernier cas où vous collez le tableau directement dans l'appel de méthode, vous devez utiliser

.
QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

pour indiquer au compilateur ce qu'est votre tableau.

Autres conseils

La construction {} est appelée un initialiseur de tableau et est utilisée pour initialiser un tableau en Java. (Référence: Section 10.6: Initialiseurs de tableaux à partir de Spécification du langage Java, troisième édition .)

Si {1, 2, 3} lui-même n'est pas valide, c'est parce qu'aucune information de type n'est associée à l'initialiseur.

Par conséquent, vous devez informer le compilateur du type du tableau en écrivant nouveau Type [] , où Type correspond au type pour lequel le tableau est créé. pour.

Ce qui suit est une utilisation valide de l'initialiseur de tableau:

  • new String [] {"Bonjour," Monde "}}
  • nouveau caractère [] {'A', 'B'}
  • new Runnable [] {new Runnable () {public void run () {}}, nouveau Runnable () {public void run () {}}

Comme on peut le constater, cette notation peut être utilisée pour de nombreux types de données. Ce n'est donc pas quelque chose qui est spécifique aux nombres entiers.

Comme pour:

int[] a = {1, 2, 3};

La raison pour laquelle ce qui précède est valide est que les informations de type sont fournies au compilateur dans la déclaration de type de variable, qui dans ce cas est int [] . Ce qui précède implique ce qui suit:

int[] a = new int[] {1, 2, 3};

Maintenant, si nous avons new int [] {1, 2, 3} , nous pouvons créer un nouveau tableau int [] , de sorte que peut être traité comme n'importe quel autre tableau int [] - c'est simplement qu'il ne porte pas de nom de variable associé.

Par conséquent, le tableau créé par new int [] {1, 2, 3} peut être envoyé dans une méthode ou un constructeur qui prend un int [] comme son argument:

new Quicksort(new int[] {1, 2, 3});  // This will work.

Ceci est probablement dû au fait que votre liste d'initialisation ne contient aucune information de saisie. Essayez ceci:

QuickSort sort = new QuickSort(new int[] {8,12,79,12,50,44,8,0,7,289,1});

Vous pouvez également faire comme ceci:

public class QuickSort {
    int[] a;

    public QuickSort(int ... a) {
        this.a = a;
    }

    public static void main(String[] args) {

        QuickSort sort = new QuickSort(8,12,79,12,50,44,8,0,7,289,1);
    }
}

Java n'a pas vraiment d'inférence de type. Les déclarations de variable de tableau sont un cas spécial dans la spécification du langage Java, qui ne s'applique pas aux paramètres de méthode. Cela serait possible, mais ajouterait beaucoup de complexité à la spécification, dans la mesure où elle aurait à traiter des questions comme celle de savoir si {"a", "b">} crée un String [] ou un objet [] - semble évident ici, mais que faire si ce sont des objets dans une hiérarchie de type complexe? Et si la méthode est surchargée et que les deux versions existent?

Les accolades (lorsqu'elles sont utilisées dans des littéraux de tableau) peuvent uniquement être utilisées lors de la déclaration du tableau:)

Avez-vous essayé de convertir la liste en int [] avant de la transmettre au constructeur?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top