Java 10附带了新的局部变量类型推断。令牌var
可用于减少声明变量时所需的样板。 e.g。
var s = "hello";
根据What type of token is exactly "var" in Java 10?,此新令牌不是“关键字”,而是“保留类型名称”。因此,“var”这个词仍然可以用作变量名,它保持与现有代码的向后兼容性。
var var = "you can do this";
当在Java 9中引入“模块”功能时,这个新令牌的类型(以及其他9个相关令牌)被称为“受限制的关键字”。也就是说,它们仅被视为特定上下文特定限制下的关键字。例如你仍然可以使用名为module的变量。
当新的语言功能以不会破坏现有用户定义符号的方式添加到C ++时,它们被称为“上下文相关关键字”。
Java 10中新的“保留类型名称”var
令牌与“上下文相关关键字”或“受限制关键字”之间是否存在概念差异。也就是说,新的var
令牌实际上只是特定上下文特定限制下的关键字。如果是这种情况,为什么不将它简单地添加到“受限制的关键字”列表中?
为了进一步增加我的困惑,JLS的当前草案版本说:
字符序列var通常被视为标识符,但是 在某些特殊情况下,就好像它是关键字一样。
这个定义听起来像是一个“受限制的关键字”。
答案 0 :(得分:9)
您引用的部分的下一句(3.8:关键字)是:
另外十个字符序列是受限制的关键字:open,module,requires,transitive,exports,opens,to,uses,provide,with。
请注意var
不在此列表中。本节中提到的var
正是为了清楚地表明,虽然在某些情况下它可能行为就像一个受限制的关键字,虽然它可能听起来像你的非正式阅读规范,它不是。
上下文相关关键字是我们可以使用的工具之一,用于以兼容的方式演变语言;保留标识符是另一个。在这种特殊情况下,可以应用任何一种,并且最后,考虑后一种工具(出于规范和编译器实现的目的)是优选的。
与大多数编译器实现一样,该规范将词法,句法和输入问题分开。关键字主要在词法分析器和解析器产生的级别处理;保留类型名称将在编译过程中稍后在类型分析期间检查,并且可以与非保留名称共享解析器产品。
从既不是规范作者也不是编译器实现者的开发人员的角度来看,差异在很大程度上是理论上的;任何一种途径都可以达到预期的效果。