java - matriciales - ¿Por qué las constantes de matriz solo se pueden usar en los inicializadores?
formulas matriciales excel pdf (4)
La única respuesta que puedes obtener es de naturaleza filosófica. La decisión de no permitir el tipo de matriz implícita está en línea con el principio de diseño general de Java para mantener las cosas simples y obvias. En el mismo sentido, podría preguntarse por qué cada downcast debe ser explícito, o cada conversión de tipo narrowing. Java es un lenguaje de cuello azul y obvio + explícito es su valor central.
Posible duplicado:
Las constantes de matrices solo se pueden usar en el error de inicializadores
Estaba estudiando matrices, y encontré este método abreviado para declarar e inicializar una matriz en una línea. Por ejemplo,
int[] a = {1, 2, 3, 4, 5};
Pero cuando traté de hacer el código siguiente, obtuve este error de compilación que decía "Las constantes de la matriz solo pueden usarse en el inicializador".
int[] a;
a = {1, 2, 3, 4};
¿Porque?
La respuesta corta es porque la especificación del idioma lo dice .
En cuanto a por qué? Sospecho que se trata de escribir . En el primer caso, el analizador sintáctico / compilador sabe que está dentro del contexto de inicialización de una variable de matriz, por lo que las llaves se pueden inferir como un inicializador de matriz.
En el último caso, no está inmediatamente claro desde la línea lo que significan las llaves. Presumiblemente, el typer se ejecuta en una fase posterior de análisis sintáctico, de modo que no era factible simplemente inferir el significado.
Este argumento parece tener peso ya que puede usar una sintaxis muy similar si declara (y técnicamente de manera redundante) el tipo nuevamente:
int[] a;
// then later
a = new int[] { 1, 2, 3, 4 };
No está permitido porque el JLS lo dice . La sintaxis solo está permitida en declaraciones y en expresiones de creación de matriz.
Estos últimos proporcionan una forma alternativa de lograr el mismo resultado:
int[] a;
a = new int[]{1, 2, 3, 4};
En cuanto a la razón subyacente real para requerir el new T[]
, mi suposición es la siguiente. Considere el siguiente inicializador de matriz:
{1, 2, 3, 4}
Se puede usar 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 requirió el new T[]
bit new T[]
, sospecho que el simple {1, 2, 3, 4}
podría causar dificultades durante el 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 esta sintaxis, la especificación del lenguaje tendría que lidiar con la complejidad de elegir qué función 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 finalmente, 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 tratar con todas estas complejidades, parece que los diseñadores del lenguaje eligen evitarlas al requerir la new T[]
sintaxis new T[]
.
Yo java solo puedes inicializar una matriz usando el primer método. No puedes asignar una matriz. Comprender por qué podría implicar alguna teoría sobre cómo se implementan las matrices. El compilador tiene que saber qué tan grande es una matriz cuando la matriz se declara, por lo que con la declaración y la inicialización en la primera línea, el compilador puede inferir el tamaño pero no el segundo.