什么类型的令牌恰好是Java 10中的"var"?

Fed*_*ner 18 java java-10

在最后一期Heinz Kabutz的时事通讯#255 Java 10:推断的局部变量中,显示它var不是Java 10中的保留字,因为您也可以使用它var作为标识符:

public class Java10 {
    var var = 42; // <-- this works
}
Run Code Online (Sandbox Code Playgroud)

但是,您不能使用ie assert作为标识符var assert = 2,因为它assert是一个保留字.

正如在链接的时事通讯中所说的那样,var不是保留字的事实是好消息,因为这允许来自Java的先前版本的代码var用作标识符在Java 10中编译而没有问题.

那么,那是什么var?它既不是显式类型也不是语言的保留字,因此它被允许作为标识符,但是当它用于在Java 10中声明局部变量时它确实具有特殊含义.我们究竟在一个上下文中调用它局部变量声明?

此外,除了支持向后兼容性(通过允许包含var作为标识符的旧代码进行编译),还有其他优点是var 不是保留字吗?

Mic*_*nic 22

根据JEP-286:局部变量类型推断,var

不是关键字; 相反,它是一个保留类型名称.

(早期版本的JEP为实现保留类型名称或上下文相关关键字留下了空间;最终选择了前一个路径.)

因为它不是"保留关键字",所以仍然可以在变量名(和包名)中使用它,但不能在类或接口名中使用它.

我认为不制作var保留关键字的最大原因是与旧源代码的向后兼容性.

  • 上下文敏感关键字是在特定产品中被识别为具有语法含义的字符序列,但在其他方面被视为普通标识符.(这通常在编译的解析阶段进行管理.)保留类型标识符是不能用作类型名称的标识符(这在编译的归属阶段处理.) (7认同)
  • [JLS:3.9](https://docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.9)提供了一个非常明确的_keyword_定义:你不能使用一个作为标识符.所以在这个意义上,`var`确实不是关键字. (5认同)
  • @bhspencer A*关键字*在3.9中明确定义.一个*上下文敏感的关键字*是另一回事.这里没有"破碎". (3认同)
  • 顺便说说.上下文敏感关键字对Java来说并不陌生.它们已经在Java 9中.例如,您可以声明`module module`. (3认同)
  • @BrianGoetz bhspencer开了一个新问题[Java 10中"限制关键字"和"保留类型标识符"之间的概念差异是什么?](/sf/ask/3437178741/概念差异 - 受限制的关键字 - 保留 - t)这可能是该问题的良好答案的一部分. (2认同)

Rou*_*han 5

var 是保留类型名称 var 不是关键字,而是保留类型名称。

我们可以创建一个名为“var”的变量。

你可以在这里阅读更多细节。

var var = 5; // syntactically correct
// var is the name of the variable
“var” as a method name is allowed.

public static void var() { // syntactically correct 
}
“var” as a package name is allowed.

package var; // syntactically correct
“var” cannot be used as the name of a class or interface.
class var{ } // Compile Error
LocalTypeInference.java:45: error: 'var' not allowed here
class var{
      ^
  as of release 10, 'var' is a restricted local variable type and cannot be used for type declarations
1 error

interface var{ } // Compile Error

var author = null; // Null cannot be inferred to a type 
LocalTypeInference.java:47: error: cannot infer type for local variable author
                var author = null;
                    ^
  (variable initializer is 'null')
1 error
Run Code Online (Sandbox Code Playgroud)