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 中的"语句"到底是什么,但是文档 国家:

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

JLS只是说(在标签上)

标识符被声明为立即包含的语句的标签。

它没有说任何关于"表达式语句"的内容。

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

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

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

  • 一个块基本上由零个或多个块语句组成
  • 块语句是以下之一:
    • 局部变量声明语句
    • 类声明
    • 陈述

因此,LocalVariableDeclarationStatement 不是层次结构中 Statement 的后代,而是同级。它们都是 BlockStatement(块语句)的类型。

标签后面必须跟着一个 true 语句,即 BlockStatement 的特定子类型,它既不是 LocalVariableDeclarationStatement,也不是 ClassDeclaration。语句的各种子类型在 14.5 中列出。您不会在其中找到 LocalVariableDeclarationStatement,尽管您会发现 ExpressionStatement 是 StatementWithoutTrailingSubStatement 的子类型。

最新更新