Java: разрешенные операторы после ярлыков
Я играю с синтаксисом Java, так что это вопрос возникает исключительно из любопытства. Этот фрагмент кода:
http://www.google.com
Object val = 5 <- 4;
компилируется не, потому что над меткой (http
) "следует инструкция". Следующие два варианта компилируются:
http://www.google.com
{ Object val = 5 <- 4; }
и
Object val;
http://www.google.com
val = 5 <- 4;
В обоих случаях я переключился с объявления на выражение.
Это заставляет меня задаться вопросом, что именно является "выражением" в Java, но doc
говорится:
В дополнение к операторам выражений существуют два других вида операторов: заявления декларации и операторы потока управления. Оператор объявления объявляет переменную.
JLS просто говорит (по меткам), что
Идентификатор объявляется меткой непосредственно содержащегося Statement.
Он ничего не говорит о "выражениях".
Я что-то пропустил, или это просто нечеткая/неправильная спецификация?
Ответы
Ответ 1
Если вы более подробно прочитаете главу 14 JLS, вы обнаружите, что LocalVariableDeclarationStatement не является Заявление. Не очень интуитивно, они?
В частности, в JLS 14.2 мы видим, что:
- Блок по существу состоит из нуля или более BlockStatements
- BlockStatement является одним из:
- LocalVariableDeclarationStatement
- ClassDeclaration
- Заявление
Таким образом, LocalVariableDeclarationStatement не является потомком Statement в иерархии, а скорее братом. Это оба типа BlockStatements.
Над меткой должно следовать истинное утверждение — то есть конкретный подтип BlockStatement, который не является ни LocalVariableDeclarationStatement, ни ClassDeclaration. Различные подтипы Statement перечислены в 14.5. Вы не найдете LocalVariableDeclarationStatement среди них, хотя вы найдете ExpressionStatement как подтип StatementWithoutTrailingSubstatement.