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

bhs*_*cer 20 java java-10

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

var s = "hello";
Run Code Online (Sandbox Code Playgroud)

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

var var = "you can do this";
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

这个定义听起来像是一个"受限制的关键字".

Bri*_*etz 9

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

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

请注意,var此列表中没有.的提及,var在本节进行精确包括要清楚的是,虽然在某些情况下,可能采取行动像一个受限制的关键字,而它听起来这种方式给你的规范你的非正式阅读,事实并非如此.

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

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

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

  • 尽管如此,这并没有开始回答这个问题.你所做的就是断言他们*是*不同的概念.OP已经意识到这一点.OP想知道他们是如何以及为什么不同."它有什么不同?" 不是一个答案,实际上只是让它听起来像不需要区别. (9认同)
  • 对不起@BrianGoets,但你的回答仍然无法帮助我理解概念差异.我能从这个答案中得到的最好结果是var不是"受限制的关键字",因为它不在列表中. (8认同)
  • 我认为它与我的不同之处在于我每周五天都会编写Java并谈论Java,并且已经做了很多年.在与同伴谈论节目时拥有准确的共享词汇是至关重要的.规范作者创建的术语成为开发人员词汇的一部分. (4认同)
  • 将答案扩展为......*"考虑(...)更好,****因为****[在此插入一些令人信服的理由] ......"*已经可以揭示出"概念差异"提问者正在寻找. (3认同)
  • @nullpointer不,我不是那个意思;)我的意思是关于关键字的部分中有一个关于`var`的句子,即使它不是关键字(限制与否),并且这句话是_included_故意,因为明晰. (2认同)