No está permitido porque el JLS says so. La sintaxis solo está permitida en declaraciones y en expresiones de creación de matriz.
Estos últimos proporcionan una forma alternativa de conseguir el mismo resultado:
int[] a;
a = new int[]{1, 2, 3, 4};
En cuanto a la razón subyacente real para exigir la new T[]
, mi conjetura es la siguiente. Considere la siguiente matriz de inicialización:
{1, 2, 3, 4}
Se puede utilizar para inicializar matrices de diferentes tipos:
new int[]{1, 2, 3, 4};
new float[]{1, 2, 3, 4};
new double[]{1, 2, 3, 4};
Si no se requiere el bit new T[]
, sospecho que el desnudo {1, 2, 3, 4}
podría causar dificultades durante análisis semántico Aquí, estoy pensando en casos como:
void f(float[] x) { ... }
void f(double[] x) { ... }
void g() {
f({1, 2, 3, 4});
}
si se permitiera que esta sintaxis, la especificación de lenguaje tendría que hacer frente a la complejidad de la elección de qué función a llamar.
En una línea similar, no está claro cuál debería ser el tipo de {null}
. Puede ser Object[]
, Integer[]
, Serializable[]
y así sucesivamente.
Y, por último, la matriz vacía {}
sería la más complicada de todas. Aquí, ni siquiera podemos decir si se trata de una matriz de objetos o una matriz de escalares.
En lugar de ocuparse de todas estas complejidades, parece que los diseñadores del lenguaje eligen evitarlas requiriendo la sintaxis new T[]
.
Esto no es un duplicado. El OP pregunta * por qué * no * cómo *. – Jeremy
Meh; no está convencido de que sea una pregunta indirecta que diga "¿cómo lo hago para que funcione?", esta pregunta pregunta "¿por qué no funciona de otra manera?". La diferencia lleva a respuestas completamente diferentes: esta pregunta ya tiene * cómo * hacer que funcione. –
Este tipo de preguntas son interesantes, pero casi imposibles de responder; todo lo que podemos hacer es especular. Sin embargo, sería realmente interesante preguntarle a quien escribió esa parte de la especificación, como un momento de enseñanza (¿por qué hiciste este diseño y no eso?). – yshavit