Java:标签后允许的语句

Mor*_*itz 18 java syntax

我正在玩Java语法,所以这个问题纯粹来自于好奇心.这段代码:

http://www.google.com
Object val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)

没有编译,因为一个标签(http)"必须紧跟声明".以下两个变体可以编译:

http://www.google.com
{ Object val = 5 <- 4; }
Run Code Online (Sandbox Code Playgroud)

Object val;
http://www.google.com
val = 5 <- 4;
Run Code Online (Sandbox Code Playgroud)

在这两种情况下,我都从声明切换到表达式.这让我想知道Java中究竟是什么"声明",但是文档 指出:

除了表达式语句之外,还有另外两种语句:声明语句和控制流语句.声明语句声明一个变量.

JLS只是说(标签),其

标识符被声明为直接包含的Statement的标签.

它没有说"表达式陈述".

我错过了什么,或者这只是一个不清楚/不正确的规范?

ysh*_*vit 20

如果您更仔细地阅读JLS的第14章,您会发现LocalVariableDeclarationStatement 不是 Statement.它们不是很直观,是吗?

具体来说,在JLS 14.2中,我们看到:

  • 块基本上由零个或多个BlockStatements组成
  • BlockStatement是以下之一:
    • LocalVariableDeclarationStatement
    • ClassDeclaration
    • 声明

因此,LocalVariableDeclarationStatement不是层次结构中Statement的后代,而是兄弟.它们都是BlockStatements的类型.

标签后面必须跟一个true语句 - 也就是BlockStatement的特定子类型既不是LocalVariableDeclarationStatement也不是ClassDeclaration.Statement的各种子类型列于14.5.您不会在其中找到LocalVariableDeclarationStatement,但您会发现ExpressionStatement是StatementWithoutTrailingSubstatement的子类型.