Подтвердить что ты не робот

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.

Он ничего не говорит о "выражениях".

Я что-то пропустил, или это просто нечеткая/неправильная спецификация?

4b9b3361

Ответ 1

Если вы более подробно прочитаете главу 14 JLS, вы обнаружите, что LocalVariableDeclarationStatement не является Заявление. Не очень интуитивно, они?

В частности, в JLS 14.2 мы видим, что:

  • Блок по существу состоит из нуля или более BlockStatements
  • BlockStatement является одним из:
    • LocalVariableDeclarationStatement
    • ClassDeclaration
    • Заявление

Таким образом, LocalVariableDeclarationStatement не является потомком Statement в иерархии, а скорее братом. Это оба типа BlockStatements.

Над меткой должно следовать истинное утверждение — то есть конкретный подтип BlockStatement, который не является ни LocalVariableDeclarationStatement, ни ClassDeclaration. Различные подтипы Statement перечислены в 14.5. Вы не найдете LocalVariableDeclarationStatement среди них, хотя вы найдете ExpressionStatement как подтип StatementWithoutTrailingSubstatement.