settitle - Java: declaraciones permitidas después de las etiquetas
que es settitle en java (1)
Estoy jugando con Java Syntax, por lo que esta pregunta surge únicamente por curiosidad. Esta pieza de código:
http://www.google.com
Object val = 5 <- 4;
no compila, porque una etiqueta ( http
) "debe ir seguida de una declaración". Las siguientes dos variantes se compilan:
http://www.google.com
{ Object val = 5 <- 4; }
y
Object val;
http://www.google.com
val = 5 <- 4;
En ambos casos, cambié de una declaración a una expresión. Esto me hace preguntarme qué es exactamente una "declaración" en Java, pero el doc dice:
Además de las declaraciones de expresión, hay otros dos tipos de declaraciones: declaraciones de declaración y declaraciones de flujo de control. Una declaración de declaración declara una variable.
El JLS simplemente dice (en las etiquetas) que
El identificador se declara como la etiqueta de la Declaración contenida de inmediato.
No dice nada sobre "declaraciones de expresión".
¿Perdí algo, o es solo una especificación poco clara / incorrecta?
Si lees el capítulo 14 de JLS con más cuidado, verás que LocalVariableDeclarationStatement no es una declaración. No es muy intuitivo de ellos, ¿verdad?
Específicamente, en JLS 14.2 , vemos que:
- un Bloque consiste esencialmente en cero o más BlockStatements
- un BlockStatement es uno de:
- Declaración de declaración de variable local
- ClassDeclaration
- Declaración
Por lo tanto, LocalVariableDeclarationStatement no es un descendiente de Statement en la jerarquía, sino un hermano. Ambos son tipos de BlockStatements.
Una etiqueta debe ir seguida de una Declaración verdadera, es decir, el subtipo específico de BlockStatement que no es LocalVariableDeclarationStatement ni ClassDeclaration. Los diversos subtipos de Declaración se enumeran en 14.5 . No encontrará LocalVariableDeclarationStatement entre ellos, aunque encontrará ExpressionStatement como un subtipo de StatementWithoutTrailingSubstatement.