Java 10中“受限关键字”和“保留类型名称”之间的概念差异是什么?

Java 10附带了新的局部变量类型推断。 令牌var可用于减少声明变量时所需的样板。 例如

 var s = "hello"; 

根据什么类型的令牌在Java 10中完全是“var”? 这个新令牌不是“关键字”,而是“保留类型名称”。 因此,单词“var”仍然可以用作变量名,它保持与现有代码的向后兼容性。

 var var = "you can do this"; 

当在Java 9中引入“模块”function时,这个新令牌的类型(以及其他9个相关令牌)被称为“受限制的关键字”。 也就是说,在某些特定于上下文的限制下,它们仅被视为关键字。 例如,您仍然可以使用称为模块的变量。

当新的语言function以不会破坏现有用户定义符号的方式添加到C ++时,它们被称为“上下文相关关键字”。

Java 10中新的“保留类型名称” var标记与“上下文相关关键字”或“受限制关键字”之间是否存在概念差异。 也就是说,在某些特定于上下文的限制下,新的var令牌实际上只是一个关键字。 如果是这种情况,为什么不将它简单地添加到“受限制的关键字”列表中?

为了进一步增加我的混淆, JLS的当前草案版本说:

字符序列var通常被视为标识符,但在某些特殊情况下,就好像它是关键字一样。

这个定义听起来像是一个“受限制的关键字”。

您引用的部分的下一句(3.8:关键字)是:

另外十个字符序列是受限制的关键字:开放,模块,需求,传递,导出,打开,到,使用,提供和使用。

请注意, var不在此列表中。 本节中提到的var正是为了清楚地表明,虽然在某些情况下它可能就像一个受限制的关键字,虽然它可能在你非正式阅读规范时听起来那样,但事实并非如此。

上下文相关关键字是我们可以使用的工具之一,用于以兼容的方式演变语言; 保留标识符是另一个。 在这种特殊情况下,可以应用其中任何一种,并且最后,考虑后一种工具(出于规范和编译器实现的目的)是优选的。

与大多数编译器实现一样,该规范分离了词法,语法和输入问题。 关键字主要在词法分析器和解析器产生的层次上处理; 在类型分析期间,在编译过程中稍后检查保留类型名称,并且可以使用非保留名称共享解析器产品。

从既不是规范作者也不是编译器实现者的开发人员的角度来看,差异在很大程度上是理论上的; 用任何一种方法都可以达到理想的效果。