De la Java Language Specification, §10.6 - les Initialiseurs de Tableau:
Un initialiseur de tableau est écrit comme une liste séparée par des virgules
expressions, délimitée par des accolades { et }.
Une virgule peut apparaître après la dernière expression dans un tableau
initialiseur et est ignoré.
Chaque variable de l'initialiseur doit être compatible avec l'assignation (§5.2) avec
le tableau du type de composant, ou une erreur de compilation se produit.
C'est une erreur de compilation si le type de composant de la matrice de
initialisée est pas reifiable (§4.7).
Un initialiseur de tableau fait partie d'une création de la matrice d'expression, qui ne définissent que vous avez besoin de l'une de ces quatre formes pour réussir à initialiser un tableau:
ArrayCreationExpression:
new PrimitiveType DimExprs Dimsopt
new ClassOrInterfaceType DimExprs Dimsopt
new PrimitiveType Dims ArrayInitializer
new ClassOrInterfaceType Dims ArrayInitializer
Encore une fois, de les specs:
C'est une erreur de compilation si le ClassOrInterfaceType ne désigne pas un reifiable type (§4.7). Sinon, le ClassOrInterfaceType peut-nom d'un nom de type de référence, même une classe abstraite de type (§8.1.1.1) ou un type d'interface (§9).
C'est pourquoi vous avez besoin de la syntaxe new int[] {1, 2, 3}
.
EDIT: Pour obtenir de plus dans les nuances de votre question:
À partir d'un compilateur de l'écrivain point de vue, ce n'introduit pas de
l'ambiguïté, n'est ce pas? Le type de la matrice peuvent être attendus à l'
même type que l'élément déclaré précédemment. En d'autres termes, n est
déclaré en tant que int, le tableau doit être de type int[]
Pas de. Il est l'ambiguïté. Comme exemple, quelle est la différence entre les deux énoncés suivants?
int[] arr1 = new int[] {1, 2, 3};
short[] arr2 = new short[] {1, 2, 3};
La différence majeure est que la compilation en bytecode. L'un est à l'évidence un int, l'autre est évidemment un court-circuit. Cependant, sans la capacité de dire quel type de données est qui (sans les valeurs dans le tableau dépassant Short.MAX_VALUE
), il serait impossible d'affirmer que, de ce tableau, au-delà de l'ombre d'un doute, est une int
. Rappelons qu'un short
tombe dans la gamme de l' int
, de sorte que vous pouvez facilement obtenir dans certains délicat/bizarre scénarios lors de l'utilisation que.
Il devient de plus en plus de plaisir: c'est le code valide.
for(int i : arr2) {
System.out.println(i);
}
Encore une fois, tant que les éléments en arr2
ne pas dépasser Short.MAX_VALUE
, vous pouvez vous en sortir avec cette référence ambiguë entre short
et int
.
C'est une autre raison pourquoi le compilateur ne peut simplement en déduire que tu veux dire int
. Vous pourrait signifier short
.*
*: N'est pas que beaucoup de gens jamais serait, mais ce n'est que dans le cas où il y en a qui ne.