Pourquoi les constantes de tableau ne peuvent-elles être utilisées que dans les initialiseurs?

Duplication possible:
Les constantes de tableaux ne peuvent être utilisées que dans les erreurs d’initialisation

J’étais en train d’étudier des tableaux et je suis passé par cette méthode rapide de déclaration et d’initialisation d’un tableau sur une seule ligne. Par exemple,

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

Mais quand j’ai essayé de suivre le code, j’ai eu cette erreur de compilation en disant “Les constantes de tableau ne peuvent être utilisées que dans l’initialiseur”.

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

Pourquoi donc

Ce n’est pas permis parce que le JLS le dit . La syntaxe est uniquement autorisée dans les déclarations et dans les expressions de création de tableaux.

Ces derniers offrent un autre moyen d’atteindre le même résultat:

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

En ce qui concerne la raison sous-jacente réelle pour exiger le new T[] , je suppose que c’est comme suit. Considérons l’initialiseur de tableau suivant:

 {1, 2, 3, 4} 

Il peut être utilisé pour initialiser des tableaux de différents types:

 new int[]{1, 2, 3, 4}; new float[]{1, 2, 3, 4}; new double[]{1, 2, 3, 4}; 

Si le new T[] bit new T[] n’était pas requirejs, je pense que le simple {1, 2, 3, 4} pourrait causer des difficultés lors de l’parsing sémantique. Ici, je pense à des cas comme:

 void f(float[] x) { ... } void f(double[] x) { ... } void g() { f({1, 2, 3, 4}); } 

Si cette syntaxe était autorisée, la spécification de langage devrait prendre en compte la complexité du choix de la fonction à appeler.

Dans le même ordre d’idées, il n’est pas clair quel devrait être le type de {null} . Il peut s’agir de Object[] , Integer[] , Serializable[] , etc.

Et enfin, le tableau vide {} serait le plus délicat de tous. Ici, nous ne pouvons même pas dire s’il s’agit d’un tableau d’objects ou d’un tableau de scalaires.

Au lieu de faire face à toutes ces complexités, il semble que les concepteurs de langage ont choisi de les éviter en exigeant la new T[] syntaxe new T[] .

La réponse courte est parce que la spécification de langue le dit .

Quant à pourquoi? Je suppose que c’est dû à la dactylographie . Dans le premier cas, l’parsingur / compilateur sait que c’est dans le contexte de l’initialisation d’une variable de tableau que les accolades peuvent être considérées comme un initialiseur de tableau.

Dans ce dernier cas, il ne ressort pas immédiatement de la ligne ce que les accolades signifient. Vraisemblablement, le typer s’exécute à une phase ultérieure de l’parsing, de sorte qu’il n’était pas possible d’inférer simplement la signification.

Cet argument semble avoir un poids car vous pouvez utiliser une syntaxe très similaire si vous déclarez spécifiquement (et techniquement de manière redondante) le type:

 int[] a; // then later a = new int[] { 1, 2, 3, 4 }; 

Je java vous pouvez seulement initialiser un tableau en utilisant la première méthode. Vous ne pouvez pas affecter un tableau. Comprendre pourquoi pourrait impliquer une théorie sur la façon dont les tableaux sont implémentés. Le compilateur doit connaître la taille d’un tableau lorsque le tableau est déclaré ainsi avec la déclaration et l’initialisation sur la première ligne, le compilateur peut déduire la taille mais pas avec le second.

La seule réponse que vous pouvez obtenir est de nature philosophique. La décision de ne pas autoriser le type de tableau implicite est conforme au principe de conception général de Java pour garder les choses simples et évidentes. Dans le même ordre d’idées, vous pouvez vous demander pourquoi chaque abaissement doit être explicite, ou chaque conversion de type plus étroite. Java est un langage de col bleu et sa valeur fondamentale est évidente et explicite.